我来自ECMAScript背景(似乎是非常C / C ++)。因此,我学习了经典的C ++样式继承,涉及类,对象,以及像多态这样的很酷的东西。
我最近喜欢Android和iOS开发。 Java似乎是基于C语言的,所以我很好地使用了我的大多数基于C的规则,但iOS足够不同,我对我的方法很谨慎 - 尤其是像对象继承这样的东西。
我问,因为似乎对作文有一些强烈的意见。从我到目前为止看到的作品来看,我不是最强的粉丝,除非该项目提供了一个很好的理由来使用它。
你是专业的Obj-C / iOS开发者,你会推荐构图而不是经典继承吗?还是情境化的东西?
答案 0 :(得分:5)
Objective-C的对象模型与C / C ++ / Java完全不同。它基于消息,因此更多的重点放在响应消息的对象上,而不是像在C / C ++ / Java中那样调用方法。
Cocoa库的方法支持更平坦的对象继承层次结构,并依赖于委托模式进行自定义并使这些对象层次结构保持平坦。为什么这样?很多库,特别是GUI,由于层次结构膨胀而导致复杂化,以至于不清楚您继承哪个类。例如,视频游戏中的大多数现代对象系统(作为我的专业行业)使用组合范例,其中通过混合行为来构造对象,因为它在实践中更灵活且更易于维护。
我不会说Cocoa库使用组合模型,而是使用模型 - 视图 - 控制器区域中明确划分的类之间的交互,并使用委托进行自定义。将定制与核心功能分开可以降低复杂性并降低层次结构。
答案 1 :(得分:0)
如果新类通常跟随Liskov Substitution Principle朝向它派生的类,请使用继承,否则,更喜欢组合/聚合。它不是一个对另一个,两者都被广泛使用。
答案 2 :(得分:0)
对我而言,这更像是您正在使用哪些课程的问题。如果您使用的是Apple的核心基础或UI库,我建议您避免使用子类。其中许多类不是具体类,而是类集群。在这些类中,os可以在运行时决定实际使用哪个类。
一般来说,我更喜欢构图,除非我有一个非常有说服力的理由来进行子类化。即使我有一个令人信服的理由进行子类化,我也经常选择为原始类创建一个方法类别。