是否可以单独提供子类以提供默认状态/配置?

时间:2013-08-10 02:53:41

标签: c# oop derived-class subclassing

假设您有一个GUI框架,支持将GUI组件嵌套在另一个内部。让我们为任何可以包含其他GUI组件的GUI组件调用基类。

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

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

// use container

OR,(这是我的问题),可以这样做:

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();这样,您最终使用抽象类型(Container),并在工厂中封装类型的“设置”,这就是工厂所做的。

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

        return container;
    }
}

2 个答案:

答案 0 :(得分:0)

实际上没有任何事情可以反对你正在采取的方法。唯一的问题是这里看到C#没有多重继承,所以你只能子类化一个“容器”。

如果只是将容器保存为有形模板并从中访问属性?

例如

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
    }
);

答案 1 :(得分:0)

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