假设您有一个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;
}
}
答案 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的一个主要原因是程序的简单模块化设计。当你从哲学的立场思考它时,你的按钮栏是一个与容器不同的对象,在一个小程序中差异可能看起来微不足道,但在较大的程序中,它可以使程序的差异易于理解。