我需要为我的C#项目设计一个类层次结构。基本上,类的功能类似于WinForms类,因此让我们以WinForms工具包为例。(但是,我不能使用WinForms或WPF。)
每个类都需要提供一些核心属性和功能。尺寸,位置,颜色,可见性(对/错),绘制方法等。
我需要设计建议我使用了一个带有抽象基类和接口的设计,这些基类和接口不是真正的类型,而更像是行为。这是一个好的设计吗?如果没有,那将是一个更好的设计。
代码如下:
abstract class Control
{
public int Width { get; set; }
public int Height { get; set; }
public int BackColor { get; set; }
public int X { get; set; }
public int Y { get; set; }
public int BorderWidth { get; set; }
public int BorderColor { get; set; }
public bool Visible { get; set; }
public Rectangle ClipRectange { get; protected set; }
abstract public void Draw();
}
有些控件可以包含其他控件,有些只能包含(作为子控件),因此我正在考虑为这些功能创建两个接口:
interface IChild
{
IContainer Parent { get; set; }
}
internal interface IContainer
{
void AddChild<T>(T child) where T : IChild;
void RemoveChild<T>(T child) where T : IChild;
IChild GetChild(int index);
}
WinForms控件显示文本,因此也可以进入界面:
interface ITextHolder
{
string Text { get; set; }
int TextPositionX { get; set; }
int TextPositionY { get; set; }
int TextWidth { get; }
int TextHeight { get; }
void DrawText();
}
某些控件可以停靠在其父控件中,因此:
enum Docking
{
None, Left, Right, Top, Bottom, Fill
}
interface IDockable
{
Docking Dock { get; set; }
}
...现在让我们创建一些具体的类:
class Panel : Control, IDockable, IContainer, IChild {}
class Label : Control, IDockable, IChild, ITextHolder {}
class Button : Control, IChild, ITextHolder, IDockable {}
class Window : Control, IContainer, IDockable {}
我在这里想到的第一个“问题”是,接口一旦发布就基本上是一成不变的。但让我们假设我将能够使我的界面足够好,从而避免将来需要对其进行更改。
我在此设计中看到的另一个问题是,每个此类都需要实现其接口,并且代码重复会很快发生。例如,在Label和Button中,DrawText()方法派生自ITextHolder接口,或者从IContainer子级管理派生的每个类中。
我针对此问题的解决方案是在专用适配器中实现此“重复”功能,并将调用转发给它们。因此Label和Button都将具有TextHolderAdapter成员,该成员将在从ITextHolder接口继承的方法内部被调用。
我认为这种设计应该使我避免在基类中必须具有许多通用功能,而这些功能会很快因虚方法和不必要的“噪声代码”而变得肿。行为的更改将通过扩展适配器而不是Control派生的类来完成。
我认为这被称为“策略”模式,尽管有关该主题有数百万个问题和答案,但我想请您提出意见,以了解我对此设计的考虑以及在设计中您会想到哪些缺陷。我的方法。
我还要补充一点,未来的需求几乎有100%的机会会要求新的类和新的功能。
IChild
看起来像一个可怕的名字。
System.ComponentModel.Component
或继承System.Windows.Forms.Control
任何其他现有的基类呢?为什么需要创建自己的控件层次结构并从头开始再次定义所有这些功能?