2013-05-08 1 views

ответ

6

Строго говоря, в 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 
+0

Спасибо, Мартин. Я все еще учусь думать в Obj-C. Это имеет большой смысл. – izk

 Смежные вопросы

  • Нет связанных вопросов^_^