2010-12-07 4 views
9

Einfache Antwort wäre Protokoll.Was entspricht einer rein virtuellen C++ - Funktion in Objective-C?

Der andere Punkt ist, dass gesagt wird, dass alle Methoden in ObjectC virtuell sind, also muss man in ObjC nicht virtuell sagen.

Ich finde es schwierig, dieses Konzept zu verstehen.

Irgendwelche Kommentare um diese Frage klarer zu klären?

Vielen Dank für Ihre Kommentare.

+0

http://stackoverflow.com/questions/5222083/implement-a-pure-virtual-method-in-objective-c –

Antwort

13

Einfache Antwort würde Protokolls.

Einfach aber falsch. Ein Protokoll ist eine Schnittstellenspezifikation. Es handelt sich um eine Sammlung von Nachrichten, die ein Objekt beantworten muss (wobei das Schlüsselwort @optional vorerst ignoriert wird).

Der Begriff "virtuelle Funktion" hat in Objective-C kein direktes Gegenstück. In Objective-C rufen Sie keine Funktionen für Objekte auf, Sie senden Nachrichten an sie. Das Objekt selbst entscheidet dann, wie auf die Nachricht zu antworten ist, typischerweise indem die Nachricht in ihrem Klassenobjekt nachgeschlagen wird, die zugehörige Methode gefunden und aufgerufen wird. Beachten Sie, dass dies alles zur Laufzeit geschieht, nicht zur Kompilierzeit.

Die Zuordnung zwischen Nachrichten (oder "Selektoren", um ihnen ihren technischen Begriff zu geben) und Methoden ist vollständig aus der @implementation aufgebaut. Die Methodendeklarationen in der @interface sind nur da, um dem Compiler die Informationen zu geben, die er benötigt, um Sie zu warnen, dass Sie möglicherweise eine Methodenimplementierung vergessen haben. Und es ist nur eine Warnung, weil Sie bis zur Laufzeit nicht feststellen können, ob das Objekt wirklich auf die Nachricht reagiert oder nicht. Zum Beispiel könnte jemand anderes eine Kategorie zu einer vorhandenen Klasse hinzufügen, die Implementierungen für fehlende Methoden bereitstellt, oder eine Klasse könnte forwardingTargetForSelector: überschreiben, um Nachrichten weiterzuleiten, auf die sie nicht anderswo antwortet.

+0

+1 Nahe genug. Obwohl Sie Methoden auf C++ - Objekte als das Senden einer Nachricht an das Objekt betrachten können, ist nur die Bindung der Nachricht zur Kompilierungszeit statt Laufzeit ausgeführt. –

+1

@Martin York: Danke für die Abstimmung. Ja, Sie können beim Aufruf einer Funktion auf einem C++ - Objekt eine Nachricht senden, aber es ist nicht wirklich wahr und es ist nicht so hilfreich, während dies in Objective-C der Fall ist und es hilfreich ist. – JeremyP

+1

Ich denke, die Urheber von OO würden mit dir nicht übereinstimmen. Das ist genau das Konzept einer Methode (Eine Nachricht an das Objekt). Der wichtige Unterschied zwischen C++ und Obj-C ist nur die Bindung des Aufrufs an die tatsächliche Methode. C++ wird zur Kompilierzeit durchgeführt. Obj-C wird zur Laufzeit ausgeführt (das ist der einzige Unterschied). Eine gute Zusammenfassung zu den OO-P finden Sie hier. http://en.wikipedia.org/wiki/Object-oriented_programming –

2

Methoden zu Objekten in Objective-C sind keine virtuellen Funktionen, sondern echte Funktionen.

Ich bitte zu unterscheiden, Methoden in Obj-C sind nicht wirklich real, wie man erwarten würde. Sie verhalten sich genau wie virtuelle Funktionen in C++, außer dass Sie in Objective-C keine "rein virtuelle" Funktion erstellen können.

Cheers, Raxit