【发布时间】:2011-02-16 23:33:19
【问题描述】:
如果我有一个类层次结构,其中子类需要使用比超类的 ivars 中指定的类型更具体的类型,最好将超类 ivar 声明为 id,或者键入它然后在子类中必要时进行强制转换?
例如,我有一个使用 Thing 类型的 ivar 的超类:
@interface SuperClass {
Thing *_typedIvar; // OR
id anonIvar;
}
@property (nonatomic, retain, readwrite) Thing *_typedIvar;
@property (nonatomic, retain, readwrite) id anonIvar; // OR
然后在子类实现中,我想使用 SubThing 来获取它的 methodNotInThing
@interface SubClass : SuperClass {
}
@implementation {
- (void)aMethod {
SubThing *subtypedIvar = (SubThing *)self.typedIvar;
[subtypedIvar methodNotInThing];
// OR
[self.anonIvar methodNotInThing];
}
}
(我在这里假设子类已将 SubThing 适当地分配给 ivar)。
我已经使用了这两种方法(到目前为止,我使用 ObjC 的时间很短),但从未完全确定哪种方法最好。我喜欢使用真实类型提供的编译器检查,以及能够在适当的地方使用点语法。但是子类中的不断转换变得非常丑陋,需要更多代码,而且不知何故对我来说味道更糟(我想这几乎不是一个论点)。但是我喜欢类型化版本中的事实,即超类实际上记录了子类应该对 ivar 做什么。
以上哪种方法更好,为什么?
【问题讨论】:
-
我已经接受了下面的答案,但仍然很想听听任何喜欢 id 路线的人的来信,并且有理由。特别是,如果有人能更好地解释我对选角的早期怀疑,我很想听听。
标签: objective-c polymorphism anonymous-types subclassing