2

GUI コンポーネントを互いに入れ子にすることをサポートする GUI フレームワークがあるとします。他の GUI コンポーネントを含むことができる任意の GUI コンポーネントの基底クラスを Container と呼びましょう。

Container soley をサブクラス化してデフォルトの構成を提供することは問題ありませんか?それとも、サブクラス化によって常に追加/オーバーライド/実装された動作を提供する必要がありますか? たとえば、画面幅の 100% を埋め、高さが 50 ピクセルで、コンポーネントを水平に配置する ButtonBar コンテナーを作成したいとします。そのようなコンテナーを構成するには、次の 2 つの例のいずれかを実行できます。

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 を ButtonBar として簡単に構成できるようにするだけです。

編集

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

実際、あなたが取っているアプローチに反対するものは何もありません。ここで唯一の問題は、C# には多重継承がないため、1 つの「コンテナー」しかサブクラス化できないことです。

代わりに、コンテナをちょっとしたテンプレートとして保持し、そのコンテナからプロパティにアクセスするのはどうですか?

例はこちら

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 に答える