1

これは初心者の質問のように聞こえるかもしれません。

class MyClass
{
    public List<MyObjects> myObjects;

    public MyClass()
    {
        //...
    }
}

class UserClass
{
    public void SomeFunction()
    {
        MyClass obj = new MyClass();

        //Should this belong in constructor of MyClass?
        obj.myObjects = new List<MyObjects>;

        //Should 'SomeFunction' initialize obj.myObjects before using it, or 
        //should it assume it has been initialized and just use it?
        obj.myObjects.Add(..);
    }
}

デフォルトのコンストラクターが呼び出されたときに、MyClass.myObjectsの作成/初期化を担当するのは誰ですか?

  1. MyClassのコンストラクタ。
  2. MyClassのユーザー。
4

1 に答える 1

1

一般に、クラスのコンストラクターは、そのクラスが使用可能な状態になるために必要なすべての作業を実行する必要があります。ここでのあなたの場合、おそらく。のアクセサメソッドを提供する必要がありますmyObjects。OOPの原則は、データをカプセル化することです。つまり、それはmyObjectsプライベートでなければなりません。アクセサメソッドを介してのみアクセスできる必要があります。そうすることで、オブジェクトを作成し、実際に必要なときにアクセサメソッドを介してリストを遅延作成できます。

これはコンストラクターを扱ったwikiの記事です。適切に記述されたコンストラクターは、オブジェクトを有効な状態のままにすることを示しています。

編集:遅延初期化でカプセル化されたmyObjects(コードサンプルはそのようなものに見えるため、C#を想定していることに注意してください)

class MyClass
{
    private List<MyObjects> myObjects;

    public MyClass()
    {
        //...
    }

    public void Add(MyObject object)
    {
        MyObjects.Add(object);
    }

    private List<MyObjects> MyObjects
    {
        get
        {
            if (myObjects == null)
            {
                myObjects = new List<MyObject>();
            }
            return myObjects;
        }
    }
}
于 2012-08-22T12:35:50.947 に答える