Строго говоря, в Objective-C нет абстрактного класса или абстрактного свойства, см., Например, эту цепочку Creating an abstract class in Objective-C для хорошего обзора.
Ваш подход не является оптимальным, поскольку он требует, чтобы суперкласс выполнял foo
и setFoo:
, что противоречит идее «абстрактности».
Лучшее решение состоит в определении «динамическое свойство» в суперкласса:
@interface SuperClass : NSObject
@property (strong, nonatomic) Foo *foo;
@end
@implementation SuperClass
@dynamic foo;
@end
и явно синтезировать его в подклассе:
@interface SubClass : SuperClass
@end
@implementation SubClass
@synthesize foo = _foo;
@end
Теперь вы можете получить доступ к foo
на объект подкласса , но на объекте суперкласса это приведет к исключению во время выполнения.
Для отложенной инициализации, вы можете использовать обычный шаблон, без каких-либо «супер-трюки»:
- (Foo *) foo
{
if(!_foo) _foo = [[Foo alloc] init];
return _foo;
}
альтернативный подход (также упоминается в вышеуказанной теме) является использование «протокол» вместо обычного суперкласса:
@protocol HasFoo <NSObject>
- (Foo *)foo;
@end
@interface MyClass : NSObject<HasFoo>
@property(strong, nonatomic) Foo *foo;
@end
@implementation SubClass
- (Foo *) foo
{
if(!_foo) _foo = [[Foo alloc] init];
return _foo;
}
@end
Спасибо, Мартин. Я все еще учусь думать в Obj-C. Это имеет большой смысл. – izk