【发布时间】:2011-01-15 08:51:22
【问题描述】:
组合和继承。
我知道它们都是在适当时选择的工具,上下文对于在组合和继承之间进行选择非常重要。然而,关于每种情况的适当上下文的讨论通常有点模糊。这让我开始考虑继承和多态是传统 OOP 的不同方面有多么明显。
多态性允许人们同样指定“is-a”关系以及继承。特别是,从基类继承隐含地在该类与其子类之间创建了多态关系。然而,虽然多态可以使用纯接口来实现,但继承通过同时传递实现细节使多态关系复杂化。这样一来,继承就与纯多态截然不同了。
作为一种工具,继承服务于程序员的方式不同于多态性(通过纯接口),它简化了实现的重用在琐碎的情况下。然而,在大多数情况下,超类的实现细节与子类的要求存在微妙的冲突。这就是我们有“覆盖”和“成员隐藏”的原因。在这些情况下,继承提供的实现重用是通过验证状态更改和跨级联代码级别的执行路径的额外努力来购买的:子类的完整“扁平化”实现细节分布在多个类之间,这通常意味着多个文件,其中只有部分适用于所讨论的子类。在处理继承时,查看该层次结构是绝对必要的,因为如果不查看超类的代码,就无法知道哪些未覆盖的细节会影响您的状态或转移您的执行。
相比之下,组合的独占使用保证您将看到哪些状态可以被显式实例化的对象修改,这些对象的方法由您自行决定调用。真正扁平化的实现仍然没有实现(实际上甚至是不可取的,因为结构化编程的好处是实现细节的封装和抽象)但是你仍然可以重用代码,你只需要查看一个地方当代码出现异常时。
为了在实践中测试这些想法,避免传统的继承以结合纯基于接口的多态性和对象组合,我想知道,
有什么对象组合和接口无法完成继承可以做到的事情吗?
编辑
在迄今为止的回复中,ewernli 认为没有一种技术可用于技术专长,而另一种则不然;他后来提到了每种技术所固有的不同模式和设计方法。这是有道理的。但是,该建议使我通过询问排他使用组合和接口来代替传统继承是否会禁止使用任何主要设计模式来完善我的问题?如果是这样,是否有在我的情况下使用的等效模式?
【问题讨论】:
-
就个人而言,我喜欢 mixins。 :)
-
我没有时间检查有效的重复,但是这个继承与组合主题在 SO 上经常被访问,例如。 stackoverflow.com/questions/216523/… 或 stackoverflow.com/questions/1598722/…。
One can always put a twist on this theme and call it a novel take on things...然而,我们应该同意的一件事是,这类问题不会导致明确甚至权威的答案。也许 CW 可能是更合适的格式... -
我并不是要重新讨论一个已经很累的辩论。诚然,我陈述我的案例的方式几乎是上述辩论的片面样本,但我的主要兴趣是回答是否存在真正不能用组合和接口代替的继承。 ps,什么是CW格式?也许我会尝试...
标签: oop inheritance polymorphism composition