直接继承的替代方案
Posted
技术标签:
【中文标题】直接继承的替代方案【英文标题】:Alternative to direct inheritance 【发布时间】:2012-10-29 09:32:15 【问题描述】:我有两个班级 class A 和 class B。我希望 class B 具有 class A 的功能以及更多自己的功能。一种非常简单的方法是从 class A 继承 class B。但由于某些实现特定的原因,我不能这样做。
我想到了另一种解决方案,我将在其中创建另一个包含所有虚函数的类 class C。 类 A 和 B 将继承自 类 C。 class 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 A
和class B
之间的紧密耦合。
【讨论】:
【参考方案2】:您可以这样做,但是如果您将 class C
创建为抽象基类并让 A 类和 B 类继承自它,那么您将意识到 class A
和 class B
将是无关的,除了以下事实:它们继承自同一个抽象基类。这意味着您将无法将 class B
的实例转换为 A
等。通常,此类实现取决于用例。
例如:
您的class C
是Person
,class A
是Teacher
,class B
是Student
。那么学生不是老师,老师也不是学生,所以这样的实现是有效的。
【讨论】:
如果 C 类不是抽象类,并且如果 C 类提供了一些默认功能,那么 A 类和 B 类将共享 C 类的功能。【参考方案3】:您可以通过创建另外两个类PA
和PB
来使用代理类,其中PB
继承PA
。这些代理类分别复制了A
和B
的接口,但实际上并没有实现它们。相反,他们只是在 A
和 B
的实例中调用函数。
【讨论】:
【参考方案4】:A 类将包含虚函数的实现,B 类也可以定义相同的一组函数
这样你会有代码重复,这不是一件好事。
如果您不想使用继承,请尝试组合。
我之前解释过作文here。
【讨论】:
您缺少“这里”链接 @alestanis:谢谢。已更正。以上是关于直接继承的替代方案的主要内容,如果未能解决你的问题,请参考以下文章