Если я правильно понимаю ваш вопрос, я считаю, что ключом является идиома [self class].
Поскольку ваше обновление запрашивает способ вызова метода класса для текущего класса, вы можете использовать [self class]
. Как в:
Structure *newStructure = [[self class] fetchStructureByID:[currentDictionary
objectForKey:@"myId"]];
inContext:managedObjectContext];
РЕДАКТИРОВАТЬ: я переделал это, чтобы вернуть id
за комментарий @ rpetrich - намного чище и избавляет от необходимости -isKindOfClass:
, если вы уверены, что тип экземпляра вы вызываете -createConfiguredObject
на .
Что касается первой части, вы можете просто вернуть id
(указатель на любой объект) и документ, подтверждающий, что он вернет экземпляр того же класса, к которому он обращался. Затем в коде вам нужно использовать [self class] везде, где вы создаете новый объект в методе.
например. если у вас есть метод -createConfiguredObject
, который возвращает экземпляр того же класса, к которому он был вызван, он будет реализован следующим образом:
// Returns an instance of the same class as the instance it was called on.
// This is true even if the method was declared in a base class.
-(id) createConfiguredObject {
Structure *newObject = [[[self class] alloc] init];
// When this method is called on a subclass newObject is actually
// an instance of that subclass
// Configure newObject
return newObject;
}
Затем вы можете использовать это в коде следующим образом:
StructureSubclass *subclass = [[[StructureSubclass alloc] init] autorelease];
subclass.name = @"subclass";
// No need to cast or use isKindOfClass: here because returned object is of type id
// and documented to return instance of the same type.
StructureSubclass *configuredSubclass = [[subclass createConfiguredObject] autorelease];
configuredSubclass.name = @"configuredSubclass";
Для справки, то, что я имел в виду с -isKindOfClass:
и приведение к соответствующему подклассу, выглядит следующим образом:
Structure *structure;
// Do stuff
// I believe structure is now pointing to an object of type StructureSubclass
// and I want to call a method only present on StructureSubclass.
if ([structure isKindOfClass:[StrucutreSubclass class]]) {
// It is indeed of type StructureSubclass (or a subclass of same)
// so cast the pointer to StructureSubclass *
StructureSubclass *subclass = (StructureSubclass *)structure;
// the name property is only available on StructureSubclass.
subclass.name = @"myname";
} else {
NSLog(@"structure was not an instance of StructureSubclass when it was expected it would be.");
// Handle error
}