Pracuję nad fabryką obiektów, aby śledzić małą kolekcję obiektów. Obiekty mogą być różnych typów, ale wszystkie będą odpowiadać na createInstance
i reset
. Obiekty nie mogą pochodzić ze wspólnej klasy bazowej, ponieważ niektóre z nich będą musiały pochodzić z wbudowanych klas kakao, takich jak NSView
i NSWindowController
.Jak mogę przekazać nazwę klasy jako argument do fabryki obiektów w kakao?
Chciałbym, aby móc tworzyć wystąpień dowolnego odpowiedniego obiektu, po prostu przechodząc żądaną classname do mojej fabryki w następujący sposób:
myClass * variable = [factory makeObjectOfClass:myClass];
Sposób makeObjectOfClass:
będzie wyglądać mniej więcej tak:
- (id)makeObjectOfClass:(CLASSNAME)className
{
assert([className instancesRespondToSelector:@selector(reset)]);
id newInstance = [className createInstance];
[managedObjects addObject:newInstance];
return newInstance;
}
Czy istnieje sposób przekazania nazwy klasy do metody, tak jak zrobiłem to z argumentem (CLASSNAME)className
powyżej makeObjectOfClass:
?
W trosce o kompletność, oto dlaczego chcę zarządzać wszystkimi przedmiotami. Chcę móc zresetować komplet obiektów w jednym ujęciu, dzwoniąc pod numer [factory reset];
.
- (void)reset
{
[managedObjects makeObjectsPerformSelector:@selector(reset)];
}
Jestem rozdarta pomiędzy Michael Tsai i odpowiedzi Matt Gallagher. Przegłosowałem oba, ponieważ obie wspominają o użyciu "klasy", której właśnie szukałem. Ostatecznie wybrałem odpowiedź Matta, ponieważ podkreśla ona "Class" nad ClassFromString i jako pierwsza wymieniła użycie "Class" przed edycją. –
@Ned Batchelder: Dziękujemy za zmianę tagu. Z jakiegoś powodu "targetc" pokazuje o wiele więcej pozycji (około 200) niż "cel-c" z rozwijanej listy tagów pojawiających się po dodaniu tagów do pytania, ale teraz widzę, że "objectc" został przekierowany do 'celu-c' –
@eJames: Twoje pytanie się pokazuje -reset jest wysyłany do instancji, a nie do obiektu klasy, więc myślę, że [aClass odpowiadaToSelektor: @selector (reset)] w odpowiedzi Matta Gallaghera jest niepoprawne. –