Was ist die richtige Methode, um Unterklassen einer singleton-Klasse in Objective-C?
Habe ich eine singleton-Klasse und ich möchte erstellen Sie eine Klasse, die Unterklasse, die von dieser singleton-Klasse, was ist die richtige Methode, es zu tun
- Die Frage muss klären, wenn alle code-verweisen auf die singleton von der Unterklasse oder wenn andere code wird benötigt, um Zugriff auf die Unterklasse von singleton über seine super-class-Eigenschaft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, über Objective-C im speziellen, sondern im Allgemeinen singleton-Klassen soll verhindern, dass Unterklassen. Wenn Sie haben eine Instanz der Basis-Klasse und eine Instanz der Unterklasse, dann haben Sie effektiv zwei Objekte, die als Instanzen der Basis des "singleton" - Klasse, haben Sie nicht?
Sobald Sie haben zwei Instanzen, es ist nicht wirklich ein singleton nicht mehr... und das ist abgesehen von den Möglichkeiten, dass es mehrere Unterklassen, oder dass die Unterklasse selbst es können mehrere Instanzen erstellt werden.
Natürlich können Sie Ihre Basis-Klasse, so hat es nur ein Weg, um in einer einzigen "Standard" - Instanz, aber das ist nicht ganz das gleiche wie, so dass es ein singleton.
Doubleton
? hahaWenn Jon nicht überzeugt, Sie tun es nicht, Sie sollten es tun auf diese Weise:
In Ihrer Superklasse, init singleton-Instanz mit
[[[self class] alloc] init]
so dann bekommst du immer eine Instanz von der Klasse, mit der Sie den Aufruf der Methode sharedInstance. Und Sie nicht haben, um ein überschreiben der sharedInstance-Methode in Ihrer Unterklasse.static
parameter muss vorhanden sein bei der super-Klasse @OMGPOPHabe ich ein Beispiel "Basis-Klasse" für singleton, können Sie es hier: https://github.com/stel/DOSingleton
Jon Skeet ist ein guter Punkt, ob Sie ihn wirklich haben eine singleton-wenn Sie erlaubt sind zu instanziieren der Klasse, und seine Unterklasse. Putting, dass abgesehen, hier ist ein Muster, das Sie verwenden können, so dass so Sie bestimmen nur noch die shared-Instanz-getter einmal, in der übergeordneten Klasse:
Dieser Ansatz hat folgende Vorteile:
[self class]
ermöglicht z.B.[SprocketSubclass defaultSprocket]
zurück eine Instanz derSprocketSubclass
stattSprocket
instancetype
kann der compiler Typ-überprüfen Sie das Ergebnis dieser Methode: es werdenSprocket
wenn Sie es aufrufen, wie+[Sprocket defaultSprocket]
aberSprocketSubclass
wenn Sie es aufrufen, wie+[SprocketSubclass defaultSprocket]
.Insbesondere, können Sie definieren, dieses accessor-Methode in der Basisklasse und dann müssen Sie nicht haben, etwas zu tun in den Unterklassen!
(Hut Tipps zu NSHipster für zu erklären, warum
instancetype
ist so cool und bbum für erinnert mich in der letzten Zeit.)[self class]
undself
ist nur stilistisch.Wenn das, was Sie suchen, ist ein schneller Weg, um das setup neue singletons. Dieses pseudo-abstrakte singleton-Basisklasse ist, was ich verwenden:
Wiederverwendbare Basis-Klasse
H
M
Dann jede Unterklasse
H
M
...und wie jedes singleton.
Wenn Sie rufen Sie die abstrakte Basis-Klasse, oder vergessen
CREATE_SHARED_INSTANCE
in der Unterklasse erhalten Sie eine freundliche Ausnahme ausgelöst.Diese Weise können Sie die Einrichtung eines neuen singletons leicht ohne performance hit.
Der einfachste Weg dies zu erreichen ist die standardmäßige Implementierung des singleton-accessor in der Klasse und der Unterklasse. Auf diese Weise jede Klasse verhält sich wie eine richtige singleton, d.h. es ist immer nur eine Instanz von beiden. Wenn Sie versuchen, die Wiederverwendung des Accessors der übergeordneten Klasse an die Unterklasse und dann, wenn Sie machen Verwendung der beiden Klassen, laufen Sie Gefahr, dass der accessor Rücksendung der falschen Instanz, weil Ihr Verhalten davon abhängig ist, in der Reihenfolge, wie Sie aufgerufen werden.
Sollten Sie nicht verwenden instancetype für die singleton-accessor, um zu verhindern diesen Fehler. Sie werden bemerken, die Apple nicht nutzen es für Ihre singletons z.B. UIApplication und CKContainer.
Wenn Sie möchten, dass vorhandener code, der greift auf die super-Klasse, die singleton-Methode eine Instanz der Unterklasse dann wahrscheinlich müssen Sie neu zu gestalten, siehe MrJre Antwort.
Ich hatte ein ähnliches problem und wie ich es gelöst ist das erstellen einer singleton-wrapper-class, die alle extra-Funktionen. Dieser singleton-Klasse enthält das original singleton (hat die singleton-Instanz als Membervariable). Auf diese Weise vermeiden Sie schmutzige tricks.
Ich hatte ein ähnliches problem, ich hatte mehrere Ziele, die benötigt werden, um eine etwas andere singleton-Implementierungen: jedes Ziel würde die base-Klasse + eine spezielle Unterklasse. Dies wurde erreicht, indem die Basis-Klasse in etwa so:
Der entscheidende Unterschied ist
[self class]
statt des eigentlichen Klassennamen. So, wenn wir rufen:[SingletonSubclass sharedInstance]
das richtige Objekt instanziiert wird.Bitte beachten Sie, dass dies ein Sonderfall ist, im Allgemeinen Fall Stimme ich mit den bisherigen Antworten.
SingletonDerivedClass
erbt vonSingletonBaseClass
. Dann, wenn ich rufe[SingletonBaseClass sharedInstance]
, ich werde eine singleton-Instanz vonSingletonBaseClass
... und dann, wenn ich anschließend rufen Sie[SingletonDerivedClass sharedInstance]
, ich werde das gleiche singleton-Instanz vonSingletonBaseClass
, anstatt eine neue singleton-Instanz vonSingletonDerivedClass
.Ich hatte das gleiche problem. Dies ist, wie zu lösen: Sie müssen mit einem statischen Wörterbuch, um Unterklassen einer singleton. Zum Beispiel:
Klasse A : NSObject -> Singleton
Klasse B : Ein
C-Klasse : A
}
Nun können Sie mit [B sharedInstance] und [C sharedInstance] ohne Probleme!