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

本文关键字:默认 状态 配置 单独进 子类 是否 | 更新日期: 2023-09-27 18:27:10

假设您有一个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();通过这种方式,您最终使用了一个抽象类型(Container),并将该类型的"设置"封装在工厂中,这就是工厂所做的

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

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

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

实际上,没有任何东西反对您所采取的方法。这里唯一的问题是C#没有多重继承,所以你只能将一个"Container"子类化。

不如将容器作为一种模板,并从中访问属性?

放大此处

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