У меня есть 3 класса Objective-C:
Animal - a subclass of NSObject
Feline - a subclass of Animal
Cat - subclass of Feline
Каждый из этих трех классов реализует (как я думал) свой собственный закрытый метод (-private_Setup) для настройки:
например в животных:
-(instancetype)init
{
self = [super init];
if (self) {
[self private_Setup];
}
return self;
}
То же самое в классах Feline и Cat.
Список необходимых классов предоставляется во время выполнения, поэтому я создаю экземпляры различных классов в зависимости от списка имен классов.
e.g.
NSString *className = ... // @"Animal", @"Feline" or @"Cat".
id animal = [[NSClassFromString(className) alloc] init];
Проблема:
Если я создаю экземпляр Cat, -private_Setup вызывается несколько раз для каждого шага в цепочке наследования. Например, цепочка вызовов для Кота:
-[Cat init]
-[Feline init]
-[Animal init]
-[Cat private_Setup] // First!
тогда из:
-[Feline init]
-[Cat private_Setup] // Second!
тогда из:
-[Cat init]
-[Cat private_Setup] // Third!
Таким образом, то, что я считал методом, приватным для каждого класса, вызывается после каждого -init в иерархии.
Может ли кто-нибудь посоветовать, как я могу решить эту проблему или изменить мои стратегии установки? Спасибо.
[отредактировано, добавлено для ясности]
На каждом уровне наследования требуется некоторая форма настройки для предоставления данных, специфичных для этого уровня. например Специальные настройки для кошек.
Таким образом, мне нужно, чтобы объект Cat был полностью настроен как Animal, как Feline и как Cat.
Я предполагаю, что один подход состоит в том, чтобы иметь разные имена методов настройки на каждом уровне. например setupAnimal, setupFeline, setupCat.
например в животных:
-(instancetype)init
{
self = [super init];
if (self) {
[self setupAnimal];
}
return self;
}
// в кошачьем:
-(instancetype)init
{
self = [super init];
if (self) {
[self setupFeline];
}
return self;
}
// в Коте:
-(instancetype)init
{
self = [super init];
if (self) {
[self setupCat];
}
return self;
}
Есть ли лучший, более предпочтительный дизайн, чем этот?