Objective c 使用组合而不是继承

Objective c 使用组合而不是继承,objective-c,inheritance,composition,Objective C,Inheritance,Composition,我来自ECMAScript背景(似乎非常熟悉C/C++)。因此,我学到了经典的C++风格继承,涉及类、对象、以及多态性之类的很酷的东西。 最近我喜欢安卓和iOS的开发。Java似乎是基于C的,所以我可以使用大部分基于C的规则,但iOS的不同程度足以让我对我的方法保持警惕——尤其是对象继承之类的方法 我这样问是因为对作文似乎有一些强烈的看法。从目前为止我对作文的了解来看,我不是最大的粉丝,除非这个项目提供了一个很好的理由来使用它 你支持Obj-C/iOS开发者,你会推荐组合而不是经典继承吗?或者它

我来自ECMAScript背景(似乎非常熟悉C/C++)。因此,我学到了经典的C++风格继承,涉及类、对象、以及多态性之类的很酷的东西。 最近我喜欢安卓和iOS的开发。Java似乎是基于C的,所以我可以使用大部分基于C的规则,但iOS的不同程度足以让我对我的方法保持警惕——尤其是对象继承之类的方法

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


你支持Obj-C/iOS开发者,你会推荐组合而不是经典继承吗?或者它是一种情境性的东西?

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

Cocoa库的方法倾向于更平坦的对象继承层次结构,并依赖委托模式进行定制,并保持这些对象层次结构平坦。为什么要这样做?许多库,尤其是GUI,由于层次结构膨胀到不清楚从哪个类继承的程度,都会遇到复杂的问题。例如,视频游戏中的大多数现代对象系统(作为我的专业行业)都使用合成范式,其中对象是通过混合行为构建的,因为在实践中更灵活、更易于维护


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

如果一个新类通常遵循其派生的类,请使用继承,否则,请选择组合/聚合。这不是一个对立的问题,两者都被广泛使用。

对我来说,这更多的是一个关于你在使用什么类的问题。如果您使用的是苹果的核心基础或UI库,我建议您避免子类化。其中许多类不是具体的类,而是类集群。在这些类中,操作系统可以在运行时决定实际使用哪个类


总的来说,我更喜欢组合,除非我有一个非常有说服力的理由去子类化。即使当我有一个令人信服的理由去创建子类时,我也常常选择为原始类创建一类方法。

这似乎是一个潜在的争论性意见问题,而不是一个导致事实答案的问题。组合是has-a关系,继承是-a关系。has-a关系似乎比is-a关系具有更好的模块性。
——你文章的每四个字都不需要采用不同的格式 <代码> >代码> <代码>。我还将添加C++具有多继承性和Objul-C不。只有这样才能模糊IS-A/HAS-A关系,即C++可以通过继承实现构图(但我不推荐)。