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 *
enthieltIch 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.
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.
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.
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
Tags und Links class objective-c methods override