【问题标题】:Responsibility of object creation within class类内对象创建的责任
【发布时间】:2012-08-22 12:29:03
【问题描述】:

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

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

【问题讨论】:

    标签: initialization class-members responsibility


    【解决方案1】:

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

    这是一篇关于 Constructors 的 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多