0

如果我有一个类层次结构,其中子类需要使用比超类的 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 做什么。

以上哪一个是更好的方法,为什么?

4

1 回答 1

1

我认为使用真正的类型会更好,尽管你的代码中到处都是强制转换。

  • 程序员应该在控制之中。在这里使用 id 有点粗心。
  • 更容易遵循,因此更容易调试。
  • 虽然到处都有演员表可能看起来很乱,但它迫使您了解您期望的类型,并且再次回到维护。它现在可能与 id 一起工作,但如果你到处都调用 id ,你怎么知道为什么某个特定的不工作?
于 2011-02-16T23:46:27.920 回答