如果我有一个类层次结构,其中子类需要使用比超类的 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 做什么。
以上哪一个是更好的方法,为什么?