使用组合而不是继承

时间:2012-03-26 17:32:10

标签: objective-c inheritance composition

我来自ECMAScript背景(似乎是非常C / C ++)。因此,我学习了经典的C ++样式继承,涉及对象,以及像多态这样的很酷的东西。

我最近喜欢Android和iOS开发。 Java似乎是基于C语言的,所以我很好地使用了我的大多数基于C的规则,但iOS足够不同,我对我的方法很谨慎 - 尤其是像对象继承这样的东西。

我问,因为似乎对作文有一些强烈的意见。从我到目前为止看到的作品来看,我不是最强的粉丝,除非该项目提供了一个很好的理由来使用它。

你是专业的Obj-C / iOS开发者,你会推荐构图而不是经典继承吗?还是情境化的东西?

3 个答案:

答案 0 :(得分:5)

Objective-C的对象模型与C / C ++ / Java完全不同。它基于消息,因此更多的重点放在响应消息的对象上,而不是像在C / C ++ / Java中那样调用方法。

Cocoa库的方法支持更平坦的对象继承层次结构,并依赖于委托模式进行自定义并使这些对象层次结构保持平坦。为什么这样?很多库,特别是GUI,由于层次结构膨胀而导致复杂化,以至于不清楚您继承哪个类。例如,视频游戏中的大多数现代对象系统(作为我的专业行业)使用组合范例,其中通过混合行为来构造对象,因为它在实践中更灵活且更易于维护。

我不会说Cocoa库使用组合模型,而是使用模型 - 视图 - 控制器区域中明确划分的类之间的交互,并使用委托进行自定义。将定制与核心功能分开可以降低复杂性并降低层次结构。

答案 1 :(得分:0)

如果新类通常跟随Liskov Substitution Principle朝向它派生的类,请使用继承,否则,更喜欢组合/聚合。它不是一个对另一个,两者都被广泛使用。

答案 2 :(得分:0)

对我而言,这更像是您正在使用哪些课程的问题。如果您使用的是Apple的核心基础或UI库,我建议您避免使用子类。其中许多类不是具体类,而是类集群。在这些类中,os可以在运行时决定实际使用哪个类。

一般来说,我更喜欢构图,除非我有一个非常有说服力的理由来进行子类化。即使我有一个令人信服的理由进行子类化,我也经常选择为原始类创建一个方法类别。