【发布时间】:2018-08-10 07:06:20
【问题描述】:
我正在用 C# 编程。我的班级设计变得相当复杂。在许多情况下,我试图尽可能避免继承;例如,我更喜欢“has-a”设计而不是“is-a”设计。
我相信我的设计会遇到指定的最终设计是多重继承的情况。我知道多重继承的禁忌,Java 和 C# 都不允许这样做。
我会尝试写一些伪代码来说明我的情况。
假设在我的开发应用程序中,我想区分屏幕上可见的项目和不可见的项目。我将创建一个类“DisplayObject”,它是要显示的所有项目的根类。
我有一个“Button”类,它将继承自 DisplayObject。
class Button : DisplayObject
但是,我想创建一个抽象类“可点击”。 (我知道,在这一点上,有些人可能会说“使用接口”,例如 IClickable。但现在,把这个建议放在一边。)
Clickable 是一个抽象类,我想提供一些默认功能。 Button 类(显然)不能同时继承自 DisplayObject 和 Clickable。
一个想法可能是让 Clickable 继承自 DisplayObject,然后 Button 继承自 Clickable。
class Clickable : DisplayObject
class Button : Clickable
这似乎是个好主意,因为我想创建一个也可点击的 Link 类。 "Link" 类可以继承自 Clickable。
没有详细说明这可能导致什么样的“臭”代码增长,我似乎正在努力使用装饰器模式。但据我记忆,装饰器模式是这样实现的:
class Button : ClickableDecorator<DisplayObject>
我也不喜欢那样。特别是如果我打算在我的类定义中添加很多“装饰器”。
所以我可能会倾向于尝试将伪装饰器列表作为 Button 类的成员:
public List<Decorator> Decorators { get; set; }
但这仍然会让人感到困惑。
总结(希望找到解决方案):
- 我不想做太多的“预重构”(重构提前完成 实际上适得其反的时间)。
- 我不想采用简单的推荐解决方案,因为那样 会引起很多麻烦,这需要 大量重构。
- 基本上,我希望有一个“有”的解决方案 多重“is-a”困境。
感谢您阅读本文!
【问题讨论】:
-
您可能想查看 WPF 类树
-
或许可以考虑构图
标签: c# inheritance interface abstract-class member