Objective-C Zeiger auf die Klasse, die ein Protokoll implementiert

7

Ich habe drei Klassen, die dasselbe Protokoll implementieren und dieselbe Elternklasse haben, die das Protokoll nicht implementiert. Normalerweise hätte ich das Protokoll als reine virtuelle Funktionen in der Elternklasse, aber ich konnte keine Objective-C-Methode dafür finden.

Ich möchte Polymorphismus für diese Unterklassen verwenden, indem ich rein virtuelle Funktionen in der Oberklasse deklariere und dann die Kinder diese Funktionen implementieren lasse. Die einzige Objective-C-Methode, die ich gefunden habe, besteht darin, jedes Kind explizit zur Implementierung eines Protokolls zu veranlassen. Wenn ich dies auf diese Weise mache, weiß die Oberklasse nicht, dass die Kinder dieses Protokoll implementieren, sodass Kompilierungszeitwarnungen angezeigt werden überall.

Irgendein Pseudocode, wenn das keinen Sinn ergibt:

%Vor%

Der Konsument dieser Klassen:

%Vor%

Der einzige nette Weg, den ich gefunden habe, um rein virtuelle Funktionen in Objective-C zu machen, ist ein Hack, indem ich [self doesNotRecognizeSelector:_cmd]; in die Elternklasse lege, aber es ist nicht ideal, da es Laufzeitfehler verursachen wird anstatt Kompilierzeit.

    
Winder 18.04.2010, 23:49
quelle

4 Antworten

5

Ich konnte den Compiler dazu bringen, mich richtig zu warnen, indem ich die superclass *currentView -Eigenschaft wie folgt aussehen ließ:

%Vor%     
Winder 19.04.2010, 15:18
quelle
11

Objective-C-Entwickler verwenden in diesen Situationen häufig die dynamische Überprüfung statt der Überprüfung der Kompilierungszeit, da die Sprache und die Frameworks dies so gut unterstützen. So könnten Sie zum Beispiel Ihre Methode so schreiben:

%Vor%     
jlehr 19.04.2010 00:08
quelle
3

Alternativ können Sie Folgendes verwenden:

%Vor%

anstelle der folgenden, wenn Sie nur die Warnung unterdrücken möchten.

%Vor%

performSelector: funktioniert nur, wenn die Anzahl der Argumente null oder eins ist. Flexiblere Aufrufe können mit NSInvocation erreicht werden.

    
NSSplendid 19.04.2010 06:22
quelle
1

Ich persönlich würde das Protokoll für die Superklasse implementieren, aber die Methoden wie folgt implementieren:

%Vor%

Wenn Sie einmal vergessen, eine Methode in einer konkreten Unterklasse zu überschreiben, sollte das sofort offensichtlich sein.

    
Dave DeLong 19.04.2010 00:10
quelle

Tags und Links