Nesnelerin küçük bir koleksiyonunu takip etmek için bir nesne fabrikasında çalışıyorum. Nesneler farklı tiplerde olabilir, ancak hepsi createInstance
ve reset
'a cevap verecektir. Nesneler ortak bir taban sınıfından türetilemez, çünkü bazılarının NSView
ve NSWindowController
gibi dahili kakao sınıflarından türetilmesi gerekecektir.Kakaoda bir nesne fabrikasına argüman olarak bir sınıf adını nasıl geçirebilirim?
:
myClass * variable = [factory makeObjectOfClass:myClass];
makeObjectOfClass:
yöntem şöyle görünecektir:
- (id)makeObjectOfClass:(CLASSNAME)className
{
assert([className instancesRespondToSelector:@selector(reset)]);
id newInstance = [className createInstance];
[managedObjects addObject:newInstance];
return newInstance;
}
makeObjectOfClass:
numaralı (CLASSNAME)className
argümanında yaptığım gibi, bir yönteme bir sınıf adı iletmenin bir yolu var mı?
Bütünlük adına, bu yüzden tüm nesneleri yönetmek istiyorum. [factory reset];
numaralı telefonu arayarak, bir nesnede tam bir nesne setini sıfırlayabilmek istiyorum. +createInstance
adında bir sınıf yöntemi varsayılabilir
- (id)makeObjectOfClassNamed:(NSString *)className
{
Class klass = NSClassFromString(className);
assert([klass instancesRespondToSelector:@selector(reset)]);
id newInstance = [klass createInstance];
[managedObjects addObject:newInstance];
return newInstance;
}
Bu:
- (void)reset
{
[managedObjects makeObjectsPerformSelector:@selector(reset)];
}
ödeme lütfen. İkisinden de bahsettim, çünkü her ikisi de aradığım şey olan 'Sınıf' kullanımından bahsetmişti. Sonunda, Matt'in cevabını seçtim çünkü ClassFromString üzerinde 'Class'ı vurgular, ve düzenlemeden önce' Class 'kullanımını kullanan ilk kişi oldu. –
@Ned Batchelder: Etiketi değiştirdiğiniz için teşekkür ederiz. Bir nedenden dolayı, 'objectivec' soruna etiket eklediğimde beliren etiketlerin aşağı açılan listesinde 'objektif-c' den çok daha fazla öğe (200 civarında) gösterir, ancak şimdi 'objectivec'in yeniden yönlendirildiğini görüyorum. 'objektif-c' –
@eJames: Sorunuz, sınıf nesnesine değil, örneklere gönderilmeyi gösterir. Bu yüzden, Matt Gallagher'ın yanıtındaki [aClass yanıtıToSelector: @selector (sıfırlama)] 'nın yanlış olduğunu düşünüyorum. –