从两个抽象类继承,其中一个也需要另一个基类的一部分

Posted

技术标签:

【中文标题】从两个抽象类继承,其中一个也需要另一个基类的一部分【英文标题】:Inherit from two abstract classes, where one of them also needs parts of the other base class 【发布时间】:2020-03-18 13:09:02 【问题描述】:

这更多是一个没有实际代码示例的理论问题,我不确定我是否只是想多了。

整个事情是我正在研究的 GUI 实现的一部分,其中 GUI 表示为由 LeafsNodes 特化组成的树结构,然后具有一些特殊行为,如文本内容、图像或其他在其特定的render() 实现中得到处理。 但是,我的问题是,我希望在某些 GUI 上具有 Hover 功能,但 Hover 功能需要!一些!基本的 GUI 元素功能,如图所示,现在我无法理解如何将这两个部分连接到最终的 Button 类中。它必须继承所有 Leaf 功能以及抽象的 Hover 东西。

有没有办法按照我想象的方式进行这项工作?或者我是否必须为所有 GUI 提供此 Hover 功能,而只为不使用它的 GUI 实现空白 onMouseEnter()onMouseExit()? 我不想将它提供给所有 GUI 的原因是因为检查鼠标是否悬停在元素上不是免费的。并非所有元素都必须是交互式的。

几点说明: - Hover 也可能被 Node 特化继承 - Hover中的函数列表已完成 - LeafNode 都以不同的方式实现了来自 Element 的一些抽象函数

如果您能为此想出更好的标题,请随时提出修改建议

【问题讨论】:

Hover 继承自Element。然后 LeafNode 继承自 ElementHover 取决于它需要什么。从Hover 继承的仍然是Elements。 那么我必须有两个单独的Hover 类,一个用于Leaf,一个用于Node,因为LeafNode 都实现了一些抽象Element职能。我将在笔记中将此添加到我的问题中 嗯...不,你不会? Leaf 和 Node 仍然能够实现所有、没有或任何抽象元素函数。 @super 是的,对不起,我看错了你在那里写的东西。但是,我是否不需要LeafLeaf_HoverNode 相同)来继承其他特殊元素?例如 LabelLeaf 并且不需要 Hover 功能。或者有没有办法从多个基础继承并根据情况选择正确的? 【参考方案1】:

我会将 Element 和 Hover 的通用功能提取到一个通用基类中:

           MouseBase
               |
 ------------------------------
 |                            |
 |                          Element
 |                            |
Hover                         |
 |             -------------------------------
 |             |                             |
 |            Leaf                          Node
 ---------------
        |
      Button

在这种情况下,如果 MouseBase 是一个虚拟基类,Button 将获得它的一个版本,否则它将通过 Element 继承获得一个,通过 Hover 继承获得第二个。

【讨论】:

听起来像个计划,我会试试看。 您对如何解决从HoverLeaf 继承时函数不明确的问题有什么建议吗? onMouseMovedEvent 必须在 MouseBase 中,并在 HoverLeaf 中被覆盖 @DJSchaffner:你必须通过说出你想要哪一个来消除歧义,例如Hover::onMouseEventusing 通常用来取更好听的名字。 有了你的建议,我得到了它的工作。谢谢!我不得不让ElementHover 继承public virtual MouseBase 并将一些基本功能移到该类中。

以上是关于从两个抽象类继承,其中一个也需要另一个基类的一部分的主要内容,如果未能解决你的问题,请参考以下文章

面向对象四大特性

来自两个派生类的多重继承

来自两个抽象类的多重继承 (Qt)

抽象基类的模糊继承:

C# 包含继承类的基类数组,访问非继承字段

面向对象程序设计——抽象基类,访问控制与继承,继承中的类作用域,拷贝函数与拷贝控制