在课堂上创建对象的责任

时间:2012-08-22 12:29:03

标签: initialization class-members responsibility

这听起来像是一个菜鸟问题。

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的用户。

1 个答案:

答案 0 :(得分:1)

通常,类的构造函数应该完成该类处于可用状态所需的所有工作。在这种情况下,您应该为myObjects提供一种访问方法。 OOP的原则是封装数据。这意味着myObjects应该是私有的。您应该只能通过访问器方法访问它。通过这样做,您可以构建对象,并在实际需要时通过访问器方法懒惰地创建列表。

这是一篇关于Constructors的维基文章。它提到正确编写的构造函数会使对象处于有效状态。

编辑:使用延迟初始化封装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;
        }
    }
}