Ich habe zwei untergeordnete Klassen, die von 'MyClass' erben, und jede untergeordnete Klasse sollte ein Singleton sein.
Ich habe dieses Muster verwendet, um eine statische Instanz zu erhalten, wenn keine anderen Klassen erben:
%Vor%Das funktioniert einfach großartig. Wenn ich jetzt zwei neue untergeordnete Klassen, FirstClass und SecondClass, die beide von MyClass erben, hinzufügen, wie stelle ich sicher, dass ich die entsprechende ChildClass zurückbekomme?
%Vor%Das oben genannte bedeutet, dass ich immer die Klasse zurückerhalte, die ich als erste Klasse instanziiert habe:
%Vor% Was ist der beste Weg, um die entsprechenden untergeordneten Klassen-Singletons zu erstellen, ohne die getInstance
-Methode zu jeder der untergeordneten Klassen hinzuzufügen?
Wenn Sie keinen guten Grund haben, sollten Sie im Allgemeinen vermeiden, Singles zu unterklassifizieren. Es schafft eine sehr verwirrende Situation. Wenn Sie ein Singleton MyClass
erstellen, können Sie dann ein Singleton FirstClass
erstellen? Da FirstClass
immer überall verwendbar sein muss, wenn MyClass
(durch Liskov) verwendbar ist, gibt es jetzt drei "singleton" MyClass
-Objekte. Jetzt ist ObjC sehr locker mit Singletons, und das ist eine gute Sache, aber das ist immer noch sehr seltsam.
OK, das sagte, was ist mit Ihrem Problem? Zuerst die Lösung, dann die Antwort. Die Lösung ist, dass MyClass
wahrscheinlich kein Singleton sein sollte, wie oben diskutiert. Befreie getInstance
in der Oberklasse und definiere sie einfach in den Unterklassen.
Die Antwort auf das, was passiert, ist in deinem dispatch_once
. Sie übergeben in allen Fällen das gleiche statische once
-Token. dispatch_once
wird nicht mehr als einmal je für ein bestimmtes Token ausgeführt. Die einzige Möglichkeit besteht darin, verschiedene Tokens für jede Klasse zu übergeben, und ich kenne keinen geeigneten Weg, dies zu tun, ohne den Code dispatch_once in jeder Datei zu duplizieren. Sie könnten versuchen, verschiedene once
-Token für jede Unterklasse zu erstellen, aber das ist wahrscheinlich mehr Ärger und Code als nur das Duplizieren der sharedInstance
-Methode.
Übrigens, nennen Sie es nicht getInstance
. "Get" hat eine besondere Bedeutung in ObjC, und du meinst das nicht hier, also ist es verwirrend. Dies wird normalerweise sharedInstance
oder besser sharedSomething
genannt, wobei "etwas" deine Klasse ist. Wenn Sie wirklich meinen, dass es ein MyClass
geben sollte und ein FirstClass
und ein SecondClass
, dann können Sie sharedInstance
in allen dreien implementieren.
Sie wissen, Singletons sind knorrig, oder? viele Singletons sind ein größeres Problem. Ende der Vorsicht.
Sie können einfach dispatch_once
verwenden, um das Basis-Singleton zu erstellen. Dann könnte Ihre Basis eine Map (z. B. Dictionary {key: ClassName | value: Instance}) ihrer abgeleiteten Typen enthalten.
, dass Sie dispatch_once
verwenden, deutet darauf hin, dass dies in einem Multithread-Kontext verwendet wird. In diesem Fall müssten Sie die Interaktionen mit dem Wörterbuch mithilfe eines Mutex schützen.
Dann würden Ihre Nachrichten von Unterklassen basierend auf der Nachrichtenklasse ( self
) bestimmen, welche Klasse gesucht werden soll (falls erforderlich, diese Instanz erstellen).
verwende id
in deinem myClass
in firstClass
wie das
Ich denke, das sollte funktionieren
Tags und Links objective-c multithreading singleton class-hierarchy