Mam 2 klasy potomne, które dziedziczą po "MyClass", a każda klasa powinna być singletonem.Tworzenie klasy singleton z dispatch_once dla klasy hiearchy
Użyłem tego wzoru dla uzyskania statycznego instancji, gdy nie mam żadnych innych klas dziedziczących:
+ (MyClass *)getInstance
{
static dispatch_once_t once;
static MyClass *instance;
dispatch_once(&once, ^{
instance = [[MyClass alloc] init];
});
return instance;
}
Działa to po prostu świetne. Teraz, jeśli dodaję dwie nowe klasy potomne, FirstClass i SecondClass, obie odziedziczone po MyClass, w jaki sposób mogę upewnić się, że otrzymam odpowiedni program ChildClass?
dispatch_once(&once, ^{
// No longer referencing 'MyClass' and instead the correct instance type
instance = [[[self class] alloc] init];
});
FirstClass *firstClass = [FirstClass getInstance]; // should be of FirstClass type
SecondClass *secondClass = [SecondClass getInstance]; // should be of SecondClass type
Doing powyższe oznacza, że zawsze wrócić niezależnie od klasy I instancja 1st jako mojego drugiego typu Klasa:
first: <FirstClass: 0x884b720>
second: <FirstClass: 0x884b720>
// Note that the address and type as identical for both.
Jaki jest najlepszy sposób na tworzenie odpowiednich pojedynczych klas dziecko bez dodawania getInstance
metodę każda z klas dzieci?
Powodem, dla którego mam tę hierarchię jest to, że mam numer wspólnego wspólnego kodu i danych, które mają wszystkie moje klasy potomne (poza "sharedInstance".) Jest to również powód, dla którego używam dziedziczenia w porównaniu do protokołów. nie powtarzaj tego samego kodu instancji dla wszystkich trzech klas pochodnych: –
+1 o nazwie "get". –