2

假设您有一个支持将 GUI 组件相互嵌套的 GUI 框架。让我们将任何可以包含其他 GUI 组件的 GUI 组件的基类称为 Container。

将 Container soley 子类化以提供默认配置是否可以,或者子类化是否应该始终提供添加/覆盖/实现的行为?例如,假设我想制作一个 ButtonBar 容器,它填充 100% 的屏幕宽度,高度为 50 像素,并水平布置其组件。要像这样配置容器,我可以执行以下两个示例之一:

Container container = new Container();
container.PercentWidth = 100;
container.Height = 50;
container.Layout = Layout.Horizontal;

// use container

或者,(这是我的问题),是否可以这样做:

public class ButtonBar : Container
{
    public ButtonBar()
    {
        PercentWidth = 100;
        Height = 50;
        Layout = Layout.Horizontal;
    }
}

ButtonBar buttonBar = new ButtonBar();
// use buttonBar

ButtonBar 对容器没有额外的功能,并且不会覆盖任何 Container 方法。它只是用来简化将 Container 配置为 ButtonBar。

编辑

我得出的结论是,最好使用返回 Container 的工厂,例如 widgetFactory.CreateButtonBar(); 这样,您最终会使用抽象类型(容器),并将类型的“设置”封装在工厂中,这就是工厂所做的。

public class WidgetFactory
{
    public Container CreateButtonBar()
    {
        Container container = new Container();
        container.PercentWidth = 100;
        container.Height = 50;
        container.Layout = Layout.Horizontal;   

        return container;
    }
}
4

2 回答 2

0

Actually nothing speaks against the approach you're taking. The only problem is see here is that C# has no multi-inheritance so you can only subclass one "Container".

How about instead just holding the container as kinda template and access the properties from that one?

Exampe here

public enum ContainerLayout {
    Horizontal,
    Vertical
}

public class Container
{
    public int PercentWidth { get; set; }
    public int Height { get; set; }
    public ContainerLayout Layout { get; set; }
}

public class ButtonBar
{
    public Container containerTemplate = null;

    public ButtonBar(Container strategy)
    {
        containerTemplate = strategy;
    }
}

// Creation would be
ButtonBar btnBar = new ButtonBar(
    new Container()
    {
        PercentWidth = 100,
        Height = 700,
        Layout = ContainerLayout.Horizontal
    }
);
于 2013-08-10T15:52:41.470 回答
0

如果某些人创建一个子类只是为了覆盖一个方法,那么您的方法同样正确。OOP 的主要原因之一是程序的简单模块化设计。当您从哲学的角度考虑它时,您的按钮栏是一种与容器不同的对象,在小程序中差异可能看起来微不足道,但在较大的程序中,它可以使程序的差异变得易于理解。

于 2013-08-14T12:50:17.203 回答