2012-05-14 10 views
6

Ich versuche eine NSInvocation zu verwenden, um eine Superklassenmethode aus der Unterklasse aufzurufen. Der Code beteiligt ist relativ einfach, es geht so:iOS - Kann 'Super' nicht als Referenz verwenden?

- (NSInvocation*) invocationWithSelector:(SEL)selector { 
    NSInvocation* call = [[NSInvocation alloc] init]; 
    [call retainArguments]; 
    call.target = super; //ERROR: use of undeclared identifier 'super' 

    call.selector = @selector(selector); 

    return call; 
} 

Dies scheint ein wenig seltsam für mich, wie ich immer war davon ausgegangen, dass super so ziemlich die gleichen Regeln wie self gefolgt (dh es als direktes behandelt werden könnte Bezug auf das betreffende Objekt und Zuordnung zu Variablen, die als Rückgabewert verwendet werden usw.). Dies scheint in der Praxis nicht der Fall zu sein.

Wie auch immer, gibt es einen einfachen Weg, um meine NSInvocation auf die Superklasse-Implementierung (ich kann self nicht als Ziel verwenden, weil die Unterklasse überschreibt die Oberklasse-Methoden), oder muss ich für einen anderen Ansatz suchen?

+0

funktioniert self.superclass? (rate einfach hier ...) – Pochi

Antwort

9

Siehe What exactly is super in Objective-C? für weitere Informationen, aber Super ist eigentlich kein Objekt. Super ist ein Schlüsselwort für den Compiler, um obj-c-Laufzeitaufrufe (speziell objc_msgSendSuper) zu generieren. Grundsätzlich ist es so, als würde man seine Klasse in die Superklasse werfen, bevor man ihr die Nachricht schickt.

BEARBEITEN Wenn Sie also die Methode, die Sie aufrufen möchten, überschrieben haben, müssen Sie eine andere Methode zum direkten Aufruf von [super method] schreiben und Ihren Aufruf so einstellen, dass er diese Methode aufruft. Die Laufzeit sendet nur Nachrichten an Objekte, und sie werden am untersten Mitglied der Vererbungskette behandelt, die sie implementiert.

+0

Interessant, also können Sie nicht indirekt eine Superklassenmethode mit 'NSInvocation' oder' performSelector ... 'aufrufen, wenn Ihre Unterklasse eine eigene Implementierung der Zielmethode bietet? Das scheint eine kleine Einschränkung zu sein. – aroth

+0

Geht das? Ermöglicht Ihnen C++ oder eine andere C-basierte Sprache dies? Ich meine, wenn Sie die Funktionalität überschreiben, bedeutet das, dass Sie Verhalten in Ihrer Klasse wollen, das sich von dem seiner Elternklasse (oder zusätzlich zu der seiner Elternklasse) unterscheidet. Wenn das nicht die richtige Idee ist, dann habe ich einen grundlegenden Fehler in meinem Verständnis von OOP. – borrrden

+0

Nein, es scheint nicht, dass andere Sprachen dies zulassen (nur mit Java versucht, gleiches Problem). Aber Sie treffen den Schlüsselpunkt mit Ihrem Kommentar "_in Ergänzung zu dem seiner übergeordneten Klasse_". Die Unterklasse hat die Möglichkeit, die Superklassenimplementierung einer überschriebenen Methode explizit aufzurufen. Und deshalb sehe ich keinen logischen Grund, warum es nicht im Stande sein sollte, implizit dasselbe mit einem 'NSInvocation' oder einem 'performSelector ...' Aufruf zu machen. Kurz gesagt, ich halte es nicht für sinnvoll, dass Aufrufe der Superklassen-Implementierung einen expliziten/sofortigen Aufruf erfordern. – aroth

1

super und self sind das gleiche Objekt, so verwenden nur

call.target = self; 

Der Unterschied zwischen ihnen ist, dass Sie super als Empfänger einer Nachricht an self als eine Möglichkeit nutzen, um sicherzustellen, dass sie die übergeordnete Klasse aufrufen ' Implementierung.

+0

Wolltest du "selbst" schreiben? – borrrden

Verwandte Themen