直接继承的替代方案

Posted

技术标签:

【中文标题】直接继承的替代方案【英文标题】:Alternative to direct inheritance 【发布时间】:2012-10-29 09:32:15 【问题描述】:

我有两个班级 class Aclass B。我希望 class B 具有 class A 的功能以及更多自己的功能。一种非常简单的方法是从 class A 继承 class B。但由于某些实现特定的原因,我不能这样做。

我想到了另一种解决方案,我将在其中创建另一个包含所有虚函数的类 class C类 A 和 B 将继承自 类 Cclass A 将包含虚函数的实现,class B 也可以定义相同的函数集,因此 class B 将具有以下功能A 级。 这是最佳解决方案吗?除了直接从 class A 继承 class B 之外,还有其他更好的解决方案吗?

【问题讨论】:

“但由于某些实现特定的原因,我不能这样做” 不是一个好的但经常(滥用)用于糟糕设计的借口。如果您的设计需要继承使用它并且如果某些实现阻止您这样做,请更改它。 “实施具体原因”是什么? 如果你可以控制 A 和 B 继承的内容(并且你必须按照你的 C-->A、C-->B 解决方案的建议)我不明白你为什么突然 缺少该控件来简单地让 A-->B 完成它。 【参考方案1】:

您要查找的内容称为Composition (over Inheritance)。

组合优于继承(或组合重用原则)在 面向对象编程是一种技术,通过它类可以 通过包含其他实现多态行为和代码重用 实现所需功能的类,而不是通过 继承。

这意味着您可以让class B 包含class A 的实例,而不是让class B 继承自class A。这也是良好的编码实践,以避免class Aclass B 之间的紧密耦合。

【讨论】:

【参考方案2】:

您可以这样做,但是如果您将 class C 创建为抽象基类并让 A 类和 B 类继承自它,那么您将意识到 class Aclass B 将是无关的,除了以下事实:它们继承自同一个抽象基类。这意味着您将无法将 class B 的实例转换为 A 等。通常,此类实现取决于用例。

例如:

您的class CPersonclass ATeacherclass BStudent。那么学生不是老师,老师也不是学生,所以这样的实现是有效的。

【讨论】:

如果 C 类不是抽象类,并且如果 C 类提供了一些默认功能,那么 A 类和 B 类将共享 C 类的功能。【参考方案3】:

您可以通过创建另外两个类PAPB 来使用代理类,其中PB 继承PA。这些代理类分别复制了AB接口,但实际上并没有实现它们。相反,他们只是在 AB 的实例中调用函数。

【讨论】:

【参考方案4】:

A 类将包含虚函数的实现,B 类也可以定义相同的一组函数

这样你会有代码重复,这不是一件好事。

如果您不想使用继承,请尝试组合。

我之前解释过作文here。

【讨论】:

您缺少“这里”链接 @alestanis:谢谢。已更正。

以上是关于直接继承的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

抽象类可否替代接口?

装饰器模式

装饰者模式——HeadFirst 设计模式学习笔记

C#替代静态类的继承[重复]

装饰器模式

纯虚拟的替代参数列表不会继承(需要“使用”)