У меня есть абстрактный интерфейс в Objective-C, где каждый подкласс должен настроить свойство, а затем сделать то же самое с этим свойством в конце init
. Я пытаюсь избежать дублирования кода примерно так:
Файл интерфейса
@interface Shape : NSObject
@property (nonatomic) PropertyType *prop;
- (id)init;
- (void)initProperty;
@end
Файл реализации
@implementation Shape
- (id)init
{
if(self = [super init]) {
[self initProperty];
[prop doSomething];
}
return self;
}
- (void)initProperty
{
}
@end
Моя проблема в том, что каждому подклассу потребуется другой набор параметров, передаваемых в initProperty
, чтобы правильно реализовать метод:
@implementation Rectangle
- (void)initPropertyWithRect:(CGRect)rect
{
prop = [RectangleStuff rectangleWithRect:rect];
}
@end
@implementation Circle
- (void)initPropertyWithRadius:(CGFloat)radius
{
prop = [CircleStuff circleWithRadius:radius];
}
@end
Есть ли чистый способ сделать то, что я пытаюсь сделать в Objective-C? Пока мои варианты выглядят так:
- Создайте «пакет с недвижимостью» и просто раздайте
NSDictionary
. - Дублируйте код
[property doSomething];
в каждом подклассе. - Каким-то образом передать фабричный объект для инициализации, и фабричный объект создаст
prop
. Этот подход кажется самым чистым, но мне нужен фабричный объект, чтобы каким-то образом сохранить прямоугольник и/или радиус как внутреннее состояние, и мне это не кажется чистым.
Есть предположения?
init
для имен этих методов. Как вы можете прочитать в: clang.llvm.org/docs/ Методы семейства init неявно используют свой параметр self и возвращают сохраненный объект. - person Gabriele Petronella   schedule 22.11.2013