2011-09-21 12 views
8

Czytając dokumentacji Apple na Tips and Techniques for Framework Developers, natknąłem się na tym oświadczeniu o wyznaczonych inicjalizatorów:Kiedy klasa miała więcej niż jeden określony inicjator?

Wyznaczony inicjująca jest metoda init klasy, która wywołuje init metody nadklasy. (Inne inicjalizatory odwołują się do metod zdefiniowanych przez klasę.) Każda klasa publiczna powinna mieć jedną lub wyznaczonych inicjalizatorów.

(podkreślenie dodane).

oparciu o moje zrozumienie-i rzeczywiście, bardzo użycie słowa „wyznaczony” -a klasy powinien mieć tylko jeden wyznaczony inicjatora. Ale zgodnie z dokumentacją dopuszcza się wiele wyznaczonych inicjalizatorów.

Zakładając, że masz dwa (lub więcej) wyznaczonych inicjalizatorów, ich rolą jest wywołanie inicjalizowanej nadklasy w celu zagwarantowania prawidłowej inicjalizacji obiektu. Ale jeśli obaj wyznaczeni inicjatorzy nazywają ten sam inicjator tej samej klasy nadrzędnej, to dlaczego potrzebowali więcej niż jednego? Czy klasa nie powinna być refaktoryzowana, aby lejczyć wszystkie inne metody init do pojedynczego wyznaczonego inicjalizatora?

Po prostu trochę nie rozumiem, jaki przypadek użycia lub wzorzec projektowania wymagałby wielu inicjalizatorów inicjowanych?

+1

Czasami parametry każdego inicjalizatora są zbyt różne, aby przejść do tego samego "określonego" inicjalizatora. Zaleca się, aby inicjatory o najmniejszych parametrach wywoływały pojedynczy inicjator o największej liczbie parametrów, ale nie zawsze ma to sens. – spstanley

+0

Nawet w przypadku, gdy twoja klasa może mieć inicjatory o bardzo różnych parametrach, czy nie powinien być odpowiedzialny tylko jeden inicjator w celu wywołania inicjalizatora nadklasy? Czy druga osoba nie powinna dostosowywać swoich parametrów i w związku z tym wywoływać wewnętrznie inicjalizowany inicjator? – LucasTizma

Odpowiedz

6

Zrobiłbyś to, jeśli chcesz mieć inną inicjalizację dla różnych obiektów tej samej klasy. Jednym z przykładów są klastry klas, takie jak NSNumber. Ma sporo inicjalizatorów dla różnych typów liczb, które mogą pomieścić. Aby zapewnić jak najdokładniejszą reprezentację, klasa powinna przechowywać swoją wartość w tym samym formacie, w jakim je otrzymała, zamiast rzucać. Oznacza to, że inicjalizatory nie mogą po prostu wywołać wspólnego inicjalizatora i powrócić. Muszą wykonać niestandardową pracę. To sprawia, że ​​są wyznaczonym inicjatorem.

Innym przykładem może być klasa dokumentu, która musi wykonać inicjalizację tylko dla nowych plików i inne inicjowanie tylko dla otwieranych dokumentów. Oba z tych inicjalizatorów wywołają ich super implementację, co z kolei wywołuje zwykłą metodę init, aby wykonać typową inicjalizację. Ponieważ jednak robią więcej niż po prostu wywoływanie innego inicjalizatora z wartością domyślną, są uważane za wyznaczone inicjatory.

+0

Dzięki za wyjaśnienia. – LucasTizma

+4

Dobry przykład to 'initWithFrame:' ​​i 'initWithCoder:' UIView'. Jeśli programujesz je instancjonalnie, chcesz ten pierwszy. Jeśli ładujesz z archiwum, później. Podklasy powinny wywoływać jedną z nich (lub jej odpowiednik = coś, co wywoła jedną z nich) w odpowiednich sytuacjach. – bshirley

Powiązane problemy