Implementieren Sie eine reine virtuelle Methode in Objective-C
Will ich gehen, um es. Aber im ernst, wie kommt man zu implementieren, die eine rein virtuelle Methode in einer "Apple" Weg? Verwenden Sie ein Protokoll über Ihre base-Klasse und Ausnahmen werfen diese Methoden?
InformationsquelleAutor der Frage Chris | 2011-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie das Programm in Objective-C Sie brauchen, um zu reinigen Sie Ihren Geist auf Dinge wie virtuelle Methoden. Sie nicht rufen Methoden auf Objective-C-Objekte, die Sie Nachrichten senden, um Sie. Objekte reagieren auf Nachrichten, die Sie nicht, aber aufgrund der dynamischen Bindung, man kann nicht sagen, dass diese erst zur Laufzeit ausgeführt.
So können Sie deklarieren Sie eine Methode, die auf ein Basis-Objekt und nicht nicht eine Implementierung bereitstellen, kein problem (außer für die compiler-Warnung), aber Sie können nicht die compiler-flag, wenn Sie direkt instanziieren eines Objekts, die mit solchen Methoden und nicht werfen einen Fehler zur Laufzeit, wenn Sie tatsächlich senden, die Nachricht an das Objekt.
Der beste Weg, um erstellen Sie "virtuelle" Basis-Klassen (meiner Meinung nach) ist, erklären die Methode und geben Sie eine stub-Implementierung, wirft eine geeignete Ausnahme.
InformationsquelleAutor der Antwort JeremyP
In Objective-C gibt es keine rein virtuelle Unterstützung als in C++.
Einer simulation wäre, dass Sie erklären, eine Methode in der Schnittstelle aber nicht implementieren es in Ihr .m-Datei. Natürlich würden Sie bekommen compiler-Warnungen, aber IIRC können Sie schalten Sie diese aus. Aber Sie bekommen keine Warnungen/Fehler, wenn Sie nicht überschreiben in der Unterklasse, die man in C++ (IIRC).
Wäre eine alternative Implementierung mit nur einer
NSAssert(NO, @"Subclasses need to overwrite this method");
Körper. Dennoch würde man nur fangen diese zur Laufzeit nicht compile-Zeit.InformationsquelleAutor der Antwort DarkDust
Je nachdem, was Sie tun, die delegate-pattern besser geeignet sein können als eine Unterklasse, wo die delegate ist definiert als
id<YourDelegateProtocol>
. Der compiler wird eine Warnung generieren, wenn Sie die erforderlichen Methoden in der delegate-Protokoll nicht implementiert.Unterklassen ist in der Regel vermieden, in Objective-C, da Objekte können nicht Erben aus mehreren Oberklassen, aber Sie umsetzen können mehrere Protokolle.
InformationsquelleAutor der Antwort Matt Stevens
Sollten Sie die:
Wie bereits von Apple, hier: https://developer.apple.com/library/mac/#documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html
InformationsquelleAutor der Antwort Antony Clements
Haben Sie ein paar Optionen, aber du bist auf dem richtigen Weg.
ObjC nicht direkt unterstützen, zwingt Subklassen zur Implementierung einer Protokoll ist der beste Weg, um überprüfen Sie es bei der Zusammenstellung.
'Heimlich' die Umsetzung der Methode in der Basisklasse und die Behauptung ist, was ich Tue, um zu bestätigen, die subclasser hat Unterklasse zur Laufzeit korrekt. Einige Leute haben gemischte Gefühle über Behauptungen, oder müssen, lassen Sie Sie aktiv, so dass es nicht immer eine gute Lösung.
Können Sie auch erzwingen, dass Subklassen die Verwendung einer bestimmten Klasse Konstruktor und Initialisierung, dann überprüfen Sie Sie umgesetzt haben, alles, was erforderlich ist, die vor der Rückgabe einer Instanz, im Fall von compiler-Warnungen nicht schneiden.
Aber ObjC fehlen einige lang-Funktionen, mit denen clients zu Schießen selbst in den Fuß, oder einen workaround zu finden, was Sie wünschen... Sie sollten nicht zu fest auf die Durchsetzung.
Hinweis: Ausnahmen sind sehr selten (und ein bisschen unsicher, zu) in ObjC.
InformationsquelleAutor der Antwort justin
Eine virtuelle Methode ist eine Methode, deren Verhalten kann überschrieben werden, in einer erbenden Klasse eine Funktion mit der gleichen Signatur (ich.e gleichen Namen mit der gleichen Anzahl von Parametern und Typ der Parameter).
Beispiel:-
////////////////////////////////////////////////////
Ausgabe:-
"Es gibt kein Schlüsselwort "Virtual" in Objective C."
InformationsquelleAutor der Antwort Deepak