在超级类中:
@property (strong, nonatomic) Foo *foo;
在子类中:
- (Foo *) foo
{
if(!super.foo) super.foo = [[Foo alloc] init];
return super.foo;
}
这有意义吗?拥有抽象属性甚至是一个好主意吗?
在超级类中:
@property (strong, nonatomic) Foo *foo;
在子类中:
- (Foo *) foo
{
if(!super.foo) super.foo = [[Foo alloc] init];
return super.foo;
}
这有意义吗?拥有抽象属性甚至是一个好主意吗?
严格来说,Objective-C 中没有“抽象类”或“抽象属性”,例如看这个线程在 Objective-C 中创建抽象类以获得很好的概述。
您的方法不是最优的,因为它要求超类实现foo
and 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