我正在为模型设计一个抽象基类,其中基类的一个属性当前是id
。我想用具体的类来定义这个“内容”属性类型是什么。使用特定类型重新定义属性以进行编译器检查是否安全?
基类.h
:
@interface Foo : NSObject
...
@property (nonatomic, strong) id content;
@end
具体课程.h
:
@interface TextFoo : Foo
...
@property (nonatomic, strong) NSString *content;
@end
具体课程.m
现在需要@synthesize
NSString *content
。这种覆盖是否安全,或者是否存在意外的副作用?在一些顶级控制器中,我将使用内省来查找Foo
的集合,所以我真的只是在寻找具体类的编译器检查。
编辑:只是为了添加一些额外的信息,这确实有用(Xcode 5.0.2),没有来自编译器的警告或错误。抽象基类甚至可以在setter中分配任意对象,子类setter / getter仍然有效。
答案 0 :(得分:1)
老实说,有些(或者说应该说很多)程序员会认为这是一种糟糕的架构设计。你可以做到这一点,但不应该这样做。
考虑到“安全性”,现在只有你自己负责这种方法,因为编译器不会支持你(由于Objective-C的动态特性)。如果您记住content
不再是 id
类型,那么您的代码可能会变得完全安全。
可能会出现这样一种情况,你指定基类的content
让我们说NSDictionary对象(这几乎是有效的)并且不知何故(如果你是醉酒和编码)你最终将这个值分配给了孩子的{ {1}}(再次感谢Objective-C的动态特性,它非常有效)。所以现在在这种情况下你不安全,你的应用程序可能会在某处崩溃。所以这个故事的寓意是我不是对Drunken Coding说不,但我对于糟糕的建筑说不。