1

ボタンやラベルなどの基本的なUIコントロールを使用するカスタムインターフェイスシステムを作成しました。一部のコントロールには多くのオプションがあるため、長いコンストラクターを使用し、1つまたは2つのパラメーターのみが異なります。そして、これは進行中の作業なので、オプションのパラメーターを頻繁に変更し、すべてのコンストラクターに変更を適用するにはかなりの時間がかかります。

public Button(string Text, Rectangle Rect, Texture2D Texture, bool moreStuff)
public Button(string Text, Point Position, Texture2D Texture, bool moreStuff)
public Button(string Text, Vector2 Position, Texture2D Texture, bool moreStuff)

dynamicの代わりにキーワードを使用してコンストラクターの数を減らしてみましたが、コンパイル、動作、そして今のところ問題ないようです。しかし、後でこのアプローチを壊す可能性のある何かが欠けているのでしょうか?RectanglePointVector2

をチェックするときに何が渡されたかdynamic Positionを確認するには、スイッチを使用して、認識されたタイプでない場合に.GetType().Name例外をスローします。default:

このようにするのは問題ありませんか、それともより良い(より安全または適切な)方法がありますか?


現在、完全にカスタマイズされたButtonインラインのインスタンスを作成することは可能ですが、その能力を失いたくありません。

4

5 に答える 5

3

面倒な場合は、コンストラクター引数を定義する必要はありません。オブジェクト初期化子を非常にうまく使用できます。

SomeButton button = new SomeButton()
{
    Text = "",
    MoreStuff = false
};
于 2013-02-16T11:34:38.003 に答える
1

これにより、パラメータオブジェクトが必要になります。これは、パラメーターごとのプロパティを持つクラスです。これで、コンストラクButtonターは1つのパラメーターのみを受け取ります。そのパラメーターオブジェクトです。

dynamic過負荷の数を減らすために使用することは、間違いなく正しいアプローチではありません。

于 2013-02-16T11:32:01.350 に答える
0

別のアプローチは、これを自分で入力することです。

class YourPositioningType {
    public int X { get; set; }
    public int Y { get; set; }

    public static YourPositioningType FromVector(Vector2 vector) {
        return new YourPositioningType() { X = vector.X, Y = vector.Y };
    }

    public static YourPositioningType FromRectangle(Rectangle rect) {
        // etc..
    }
}

上記の各タイプから変換する静的メソッド。次に、それを次のように呼びます。

Button b = new Button("Blah", YourPositioningType.FromVector(new Vector2() { /* etc */));

次に、上記のクラスを単一のコンストラクターで使用します。

于 2013-02-16T11:35:25.973 に答える
0

シナリオでの使用dynamicは適切ではありません。異なるコンストラクターのオーバーロードがあることは悪いことではありません(dynamicキーワードを悪用するよりも価値がありません)。.NET Framework BCLの多くのクラスには、いくつかのコンストラクターオーバーロードがあり(たとえば、FileStreamクラスには15個のコンストラクターがあります)、一部のメソッドには、さまざまな用途のためにいくつかのオーバーロードがあります(MessageBox.Showたとえば)。

于 2013-02-16T11:32:10.250 に答える
0

オブジェクト初期化子を使用する場合は、必要な個々のプロパティを個別に設定できます。さまざまなプロパティを個別に初期化できることに注意する必要があります。

例えば:

public class Button
{
    public int Width
    {
        get
        {
            return Rectangle.Width;
        }
        set
        {
            Rectangle.Width = value;
        }
    }

    public int Height
    {
        get
        {
            return Rectangle.Height;
        }
        set
        {
            Rectangle.Height = value;
        }
    }

    public int X
    {
        get
        {
            return Rectangle.Left;
        }
        set
        {
            Rectangle.Left = value;
        }
    }

    public int Y
    {
        get
        {
            return Rectangle.Top;
        }
        set
        {
            Rectangle.Top = value;
        }
    }

    public Rectangle Rectangle
    {
        get;
        set;
    }
}

上記のようなクラスがある場合は、次のいずれかを実行できます。

var button = new Button
{
    Rectangle = new Rectangle(...)
}

また:

var button = new Button
{
    Left = 0,
    Top = 0,
    Width = 100,
    Height = 20
}

オブジェクト初期化表記は、設定が必要なプロパティの複数の組み合わせを持つことができるプロパティを介してオブジェクトを初期化するのに理想的です。

于 2013-02-16T11:48:48.043 に答える