【问题标题】:What considerations determine whether to type and then cast to subtypes, or to use id?是什么考虑决定了是键入然后强制转换为子类型,还是使用 id?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 这是正确的。除非您被正在使用的令人兴奋的动态语言(如 Ruby)强迫,否则您不会丢弃类型信息。然后你把所有类型信息都扔进垃圾箱(你甚至不能声明类型),并且你每天加班几个小时来编写单元测试。有人会说,这些时间是通过不必键入您的类型获得的:)
  • 我从来不理解无类型语言的吸引力。我只是觉得懒惰,但也许我是老派。 ;)
  • 我在这里基本上同意你的看法,除了你评论说在这里使用 id 会“粗心”。可能是这样,但也可能是对这里设计问题的合理回应(即子类为成员分配不同的类型)。
  • 我不愿意管理结构如此之小以至于成员至少不是一个共同的超类型或协议的代码。
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2016-03-14
  • 2017-06-14
  • 2021-09-11
相关资源
最近更新 更多