1

私はしばしばこれをやっていることに気づきます:

class MyClass
{
    public MyClass(int x)
    {
        this.x = x;
    }        
    private int x;

    ...
}

構成用の新しいプライベート メンバー変数を追加するたびに、それをコンストラクターのパラメーター リスト、コンストラクター本体、およびメンバーとしてクラスに追加する必要があります。余分な入力を避けるための適切なプログラミング パターンはありますか?

4

2 に答える 2

2

一般的に言えば、コンストラクターに渡さなければならない一連のプライベート メンバーを使用してクラスをインスタンス化する場合、既に何か問題が発生しています。

MyClass myClass = new MyClass(x, y, z, 7, 'c', someOtherClass)

必要に応じて、関連するフィールドを構造体または別のクラスにカプセル化できます。

class MyClass
{
    public MyClass(Coordinates coords)
    {
        this.coords = coords;
    }
    private Coordinates coords;

}

public struct Coordinates
{
     public int X{get; set;}
     public int Y{get; set;}
     public int z{get; set;}
}

そして、それをインスタンス化できます

MyClass myClass = new MyClass(new Coordinates() { X = 1, Y = 2, Z = 3 });

特定の実装がなければ、最適なソリューションを決定するのはちょっと難しいですが、実際にクラス外からフィールドを設定する必要がない場合は、次のようなことができます

class MyClass
{
    public MyClass()
    {

    }        
    private int x = 2;

    ...
}

また

class MyClass
{
    public MyClass()
    {
        this.x = 2;
    }        
    private int x;

    ...
}
于 2013-03-13T17:26:22.030 に答える
0

目標を達成するために継承を悪用できることがわかりました。基本クラスの依存関係をプラグインするという唯一の目的を持つ「ローダー」サブクラスをセットアップしました。次に、基本クラスを操作して、ローダーを忘れることができます。

繰り返しになりますが、これには、基本コンストラクターでこれらの保護されたメンバー変数を使用できないという恐ろしい副作用があります。代わりに .Start() 関数などを使用する必要があります。したがって、これはかなり悪い解決策ですが、キーストロークはいくらか節約できます。

public class MyClass
{
    protected int param1;
    protected int param2;

    public void DoStuff()
    {
        Console.WriteLine(param1 + param2);
    }
}


public class MyClassLoader : MyClass
{
    public MyClassLoader()
    {
        param1 = 1;
        param2 = 2;
    }
}

class Program
{
    static void Main(string[] args)
    {

        MyClass myObj = new MyClassLoader();
        myObj.DoStuff();

        Console.WriteLine("Press any key to quit.");
        Console.ReadKey();
    }
}
于 2013-03-14T18:49:19.850 に答える