Wie überschreibe ich eine Klassenmethode in einem Objective-C in einer Unterklasse richtig?

9

Im zweiten Kapitel seines iOS-Programmierbuchs beschreibt Joe Conway die Verwendung von "self" in Klassenmethoden im Falle von Unterklassen. Ich verstehe dieses Konzept und habe eine Frage zum Thema Subclassing.

Hintergrund: Wir haben eine Possession-Klasse erstellt, deren Klassenmethode + randomPossession folgendermaßen aussieht:

%Vor%

Ich bin mir bewusst, dass der Rückgabewert wirklich vom Typ ID sein sollte, so dass id newPossession = ...

Ich unterordnete Possession und erstellte eine Klasse namens BallGlove, die eine neue iVar, brandName, einen NSString *

enthielt

Ich habe die + randomPossession in BallGlove wie folgt überschrieben:

%Vor%

Meine Frage ist folgende: Ist die Art und Weise, wie ich diese Klassenmethode aneignete und akzeptabel für die Gemeinschaft war (dh parallel das -init-Format durch Erfassen der Superimplementierung in einer Variablen, manipulieren Sie die Variable entsprechend und geben Sie sie dann zurück? Ausgabe zeigt, dass das zurückgegebene Objekt eine Instanz von BallGlove ist, aber ich war an der akzeptablen Implementierung interessiert. Vielen Dank im Voraus.

    
Brian Palma 28.12.2011, 17:20
quelle

4 Antworten

0

Es ist technisch in Ordnung.

Ich würde jedoch eine Alternative vorschlagen. Wenn Sie bereits einen bestimmten öffentlichen Initialisierer für Ihre Basisklasse haben (den Sie vielleicht trotzdem von dieser Factory-Klassenmethode erstellen und aufrufen möchten) und dann diesen Initialisierer (oder sogar einen neuen Initiator aus Ihrer Unterklasse) in der Klasse Ihrer Unterklassen verwenden Methode.

Es ist nicht viel mehr Code, aber meiner Meinung nach einfacher zu folgen und zukunftssicher. Der Initialisierer könnte auch einmal nützlich sein, aber natürlich ist es keine Lösung für jede Anwendung.

    
Eiko 28.12.2011, 19:32
quelle
2

Ja, das ist ein vollkommen vernünftiger Weg. Es gibt nichts besonders Unterschied zwischen Klassenmethoden und normalen Methoden - nur dass diese von einer Klasse und die andere von einer Instanz ausgeführt wird.

    
Chuck 28.12.2011 18:10
quelle
2

Sobald Sie eine Klassenmethode überschreiben, können Sie entscheiden, ob Sie sie mit Hilfe der Super-Implementierung oder ohne sie implementieren möchten. Es liegt ganz bei Ihnen. Das Überschreiben von Init ist eine völlig andere Geschichte, nicht nur, weil es sich um eine Instanzmethode handelt, sondern weil eine Konvention / einen Vertrag damit verbunden ist. Denken Sie daran, dass beispielsweise das Liskov-Substitutionsprinzip nicht verletzt werden sollte.

Ihr von der Klassenmethode überschriebenes ist völlig in Ordnung, obwohl ich überlegen würde, Klassenmethoden einen Design-Geruch zu übersteuern. Obwohl es in Objective-C sehr gut möglich ist, ist es nicht in anderen Sprachen und das aus einem sehr guten Grund. Polymorphismus als Konzept ist besser an Instanzen gebunden, die als Ersatz für einander verwendet werden können, während das Verwenden von Klassenmethoden das Konzept bricht (d. H. Keine echte Substitution). Es ist clever, aber nicht unnötig intuitiv und flexibel.

    
Johannes Rudolph 28.12.2011 18:20
quelle
1

Ja, es ist akzeptabel, Ihre Initialisierung so zu machen. Genau so wird es in den meisten Fällen gemacht. Ich meine, das ist der Grund, von einer Superklasse überhaupt zu erben. Sie wollen zusätzlich zu dem, was in der Superklasse vorhanden ist. Also fügen Sie Code in das ein, was für die geerbte Klasse spezifisch ist, und dies sollte auf diese Weise geschehen.

Ich denke, wie Sie das BallGlove -Objekt initialisiert haben, ist auch ein Faktor dafür, wie Sie Ihre geerbte Methode definieren. Die Frage tritt auf, wenn Possession init aufgerufen wird oder BallGlove init aufgerufen wird (Nicht das Erstellen einer Instanz einer Klasse ist der einzige Ort, an dem eine Klassenmethode verwendet werden kann). Es kommt also auf die Logik des Erstellens Ihrer Objekte an, dh wie gut Sie BallGlove object beschreiben - stellen Sie sicher, dass Ihre Klassenmethode sie so beschreibt, dass sie den Objektkriterien BallGlove entspricht und nicht zum generischen% co_de wird % Objekt. Meine Antwort ist, dass wenn Sie es richtig implementieren können, eine parallele Linie von Klassenmethoden akzeptabel ist.

Es spielt auch keine Rolle, ob Sie vom Typ Possession in Ihrer Superklasse zurückgeben, weil Possession auf ein Objekt eines beliebigen Klassentyps zeigen kann

    
MadhavanRP 28.12.2011 17:41
quelle