2010-05-19 10 views
8

Wie in Java:Wie geordnete Klasse Methoden außer Kraft gesetzt zu werden von Unterklasse in Ziel zu vermeiden - c

A final Klasse nicht unterklassiert werden kann. Dies geschieht für aus Gründen der Sicherheit und Effizienz. Dementsprechend sind viele Klassen der Java-Standardbibliotheken endgültig, zum Beispiel java.lang.System und java.lang.String. Alle Methoden in einer finalen Klasse sind implizit endgültig.

Wie kann ich dieses Verhalten in objective-c erreichen?

+3

können Sie nicht +++++ – Sam

+1

Was meinst du mit Sicherheit? Wie verbessert 'java.lang.String' 'final' die Sicherheit? – JeremyP

+0

@jeremyP : g Wenn Sie "final in Java" verwenden, erhalten Sie eine Antwort. – Manjunath

Antwort

10

Sie können nicht. Effizienz kommt nicht dazu. Wenn Sie sich so um Sicherheit kümmern, verwenden Sie nicht objective-c. Es wird immer einen Weg geben, alle Maßnahmen, die Sie ergreifen, zu umgehen.

+0

Sind Sie sicher, dass wir in obj-c keine solchen Einrichtungen haben? Sie meinten, dass obj-c diese Art von Sicherheit nicht bietet? – Manjunath

+3

Objective-c ist grundsätzlich offen - ich kann alles zur Laufzeit tun, Klassen hinzufügen, Eigenschaften entfernen, Methodenimplementierungen vertauschen, sogar dynamisch neuen Code dynamisch kompilieren. Ich kann das für alle Klassen, beliebige Eigenschaften, sogar private iVars und alle Methoden tun. Nun, sicher, Sie können alle diese Techniken verwenden, um Sicherheitsmaßnahmen zu Ihrem Code hinzuzufügen (es wäre definitiv nicht effizienter). Aber die gleichen Maßnahmen werden immer für jeden verfügbar sein, der sich mit Ihren Techniken herumschlagen möchte - es ist also keine gute Zeit. – hooleyhoop

4

Es gibt kein endgültiges Äquivalent in objective-c. Es sind die gleichen Muster, die eine gute Alternative sein könnte, sie werden Ihnen eine bessere Trennung geben, aber weder Leistung noch Sicherheit:

  1. Wenn Sie nur bestimmte Methoden überschrieben werden mit delegate Muster zulassen möchten vielleicht eine bessere Wahl sein.
  2. Wenn Sie überhaupt keine Unterklasse erstellen möchten, können Sie das Muster abstract factory verwenden. Deklarieren Sie eine öffentliche Schnittstelle + Factory-Methoden, und verbergen Sie die konkreten Implementierungsklassen.
6

Wie schon mehrmals gesagt wurde, können Sie nicht.

Allerdings, wenn Sie eine Bibliothek machen (was der einzige Fall ist, in dem ich sehen könnte, dass dies relevant ist), gibt es ein paar Schritte, die Sie ergreifen können. Naja, wirklich.

Schreiben Sie in der Dokumentation der Klasse, dass "diese Klasse nicht für Unterklassen vorgesehen ist". (Ref. NSIndexSet) oder "Sie diese Methode nicht außer Kraft setzen." (Ref. +[NSApplication sharedApplication].

Als eine Möglichkeit der Erklärung ist es erwähnenswert, dass (so ziemlich) alles, was in Obj-C geschieht, und das trennt es von C, passiert zur Laufzeit, und die Laufzeit ist sozusagen "Right There". Jedes Stück Code kann die Laufzeit in ihrer Freizeit inspizieren, mutieren oder pervertieren, was Obj-C zu einer furchtbar mächtigen Sprache macht in Bezug auf seine "Meta-Sprache" Struktur.

Verwandte Themen