Design patterns 复合模式相对于简单继承的好处

Design patterns 复合模式相对于简单继承的好处,design-patterns,Design Patterns,我试图弄明白为什么复合继承比简单继承更好 例如,假设我们想要实现一个文件系统。 所以基本上我们需要文件和文件夹。 当文件和文件夹类继承基本接口并且文件夹类保存接口类型集合时,我们可以使用复合模式 但看起来(对我来说)简单的继承也可以做同样的事情。 如果文件是根类,文件夹继承自文件,则文件夹可以保存文件的集合,故事结束 我错过什么了吗 如果File是根类且文件夹继承File,则该文件夹可以保存文件集合 这本质上就是复合模式,即使您不这样称呼它:-) 除此之外,在您的变体中,文件夹将继承它不能(或更

我试图弄明白为什么复合继承比简单继承更好

例如,假设我们想要实现一个文件系统。 所以基本上我们需要文件和文件夹。 当
文件
文件夹
类继承基本接口并且
文件夹
类保存接口类型集合时,我们可以使用复合模式

但看起来(对我来说)简单的继承也可以做同样的事情。 如果
文件
是根类,
文件夹
继承自
文件
,则
文件夹
可以保存
文件
的集合,故事结束

我错过什么了吗

如果File是根类且文件夹继承File,则该文件夹可以保存文件集合

这本质上就是复合模式,即使您不这样称呼它:-)

除此之外,在您的变体中,文件夹将继承它不能(或更糟的是:不应该)使用的特定于文件的功能。因此,您最终会使实现复杂化,以确保客户端无法将字节附加到文件夹的“末尾”等

仅供参考,GoF书的续集,讨论了使用各种模式(包括复合模式)实现文件系统。强烈推荐阅读

如果File是根类且文件夹继承File,则该文件夹可以保存文件集合

这本质上就是复合模式,即使您不这样称呼它:-)

除此之外,在您的变体中,文件夹将继承它不能(或更糟的是:不应该)使用的特定于文件的功能。因此,您最终会使实现复杂化,以确保客户端无法将字节附加到文件夹的“末尾”等


仅供参考,GoF书的续集,讨论了使用各种模式(包括复合模式)实现文件系统。强烈推荐阅读。

在您的示例中,一个重要的区别变得非常明显。在大多数语言中,继承是一种编译时机制。在源代码中定义类之间的关系

组合通常与继承相结合。如果部件具有多态接口,则可以在运行时决定如何组合复杂对象


最后,这取决于所使用的语言。在C++中,继承只应用于多态性。在像Python这样的语言中,这是不正确的。在这里,您可以通过组合和继承实现相同的功能。

在您的示例中,一个重要的区别变得非常明显。在大多数语言中,继承是一种编译时机制。在源代码中定义类之间的关系

组合通常与继承相结合。如果部件具有多态接口,则可以在运行时决定如何组合复杂对象


最后,这取决于所使用的语言。在C++中,继承只应用于多态性。在像Python这样的语言中,这是不正确的。在这里,您可以通过组合和继承实现同样的效果。

我建议您阅读《第一设计模式》一书,第一章“设计模式简介”讨论了策略模式,有一个非常详细的例子,你可以了解合成以及为什么我们喜欢合成而不是继承。

我建议你阅读第一本设计模式书,第一章“设计模式介绍”讨论了策略模式,有一个非常详细的示例,您可以了解组合以及为什么我们喜欢组合而不是继承。我建议您最好阅读此pdf:--此pdf肯定会对您有所帮助。谢谢。

我建议你最好看一下这张pdf:--这张pdf肯定会对你有所帮助。谢谢。

答案在某种程度上取决于所使用的语言。您对哪种语言或一组语言感兴趣?在某些语言中没有多重继承。你的建议剥夺了你从文件以外的任何东西继承文件夹功能的机会。目前我使用的是c#(或java)。答案的可能重复在某种程度上取决于所使用的语言。您对哪种语言或一组语言感兴趣?在某些语言中没有多重继承。你的建议剥夺了你从文件以外的任何东西继承文件夹某些功能的机会。目前我使用的是c#(或java)可能与我的要求重复,因为我在一次面试中参加了一次测试。我没有使用复合模式。我做了一个简单的继承,因为该文件没有任何东西可以隐藏在folder类中。我确信这就是我没有通过考试的原因,我的应用程序按照他们的要求运行。谢谢你的链接@Avi,在一般类设计中,不建议从具体类继承;这几乎总是为微妙的身份/比较问题和bug打开了大门。例如,考虑到要比较的另一个对象实际上可以是
文件夹
,您将如何编写
File.compareTo()
?老实说,在您的示例中,我看不到简单继承和复合继承之间的区别。在这两种情况下,文件和文件夹的类型都不同。@Avi,区别在于,在经典组合中,层次结构的基础将是一个接口或抽象类(我们称之为节点),由文件夹和文件实现。因此,后者将是真正不同的类型,与您的设计相反,文件夹是一个文件。我没有使用复合模式。我做了一个简单的继承,因为该文件没有任何东西可以隐藏在folder类中。我确信这就是我没有通过考试的原因,我的应用程序按照他们的要求运行。谢谢你的链接@Avi,在一般类设计中,不建议从具体类继承;这几乎总是为微妙的身份/比较问题打开了大门