Es gibt ein viertes Muster ....
(1) Typ Mismatch ist schlecht.
(2) Der statische Verweis auf die Klasse liefert eine Methode, die sich in Unterklassen nicht richtig verhält.
(3) dynamischer Verweis auf Klasse bedeutet, dass Unterklassen als Unterklasseninstanzen instanziiert werden
(4)
%Vor% llvm hat das Schlüsselwort instancetype
hinzugefügt, das besagt: "yo! Diese Methode gibt eine Instanz der Klasse zurück, die sie aufgerufen hat". Wenn Sie also die obigen Informationen ableiten, könnten Sie:
Aber das würde warnen (jenseits der schrecklichen Farbwahl):
%Vor%Während der Rückgabetyp (id) im zweiten Fall nicht warnt.
Beachten Sie, dass ich auch deklariert newInstance
explizit vom Typ Rectangle*
geschaltet habe. Dies ist auch besser, da im Kontext dieser Methode newInstance
nur sicher als Rectangle*
behandelt werden kann.
In der Klassenmethode self
bezieht sich auf die Klasse, nicht auf ein Instanzobjekt.
Wenn das Rechteck unterklassifiziert würde (MyFancyRectangle), würde dies immer noch ein einfaches Rectangle-Objekt zurückgeben, während
%Vor% würde ein MyFancyReactangle
zurückgeben, wenn es wie MyFancyReactangle *r = [MyFancyReactangle rectangleOfColor:[UIColor redColor]]
aufgerufen wird, da [self alloc]
für die Unterklasse aufgerufen wird. Beachten Sie, dass hier self
erneut für die Klasse aufgerufen wird, da +alloc
eine Klassenmethode ist.
Aus demselben Grund sollten alle Methoden init…
und bequeme Creator id
zurückgeben. Es erlaubt Unterklassen, untergeordnete Objekte zurückzugeben, ohne dass der Compiler verrückt wird.
Im ersten Fall weisen Sie den self
-Zeiger (der auf das Rectangle
-Klassenobjekt verweisen sollte) einer Instanz von Rectangle
zu. Das ist absolut falsch.
In der zweiten Klasse programmieren Sie eine Klasse instanziieren - Rectangle
in diesem Fall.
In der dritten Klasse erlauben Sie der Klasse, die Klasse der Instanz zu bestimmen, anstatt sie explizit im Code anzugeben. Wenn Ihre Dodecahedron
-Klasse denselben Code verwenden muss, muss der Klassenname nicht geändert werden.
Tags und Links objective-c cocoa class-method