【问题标题】:Calling one constructor by other由另一个调用一个构造函数
【发布时间】:2012-02-08 15:44:53
【问题描述】:

如果有多个构造函数,另一个构造函数调用一个构造函数有什么好处? 谢谢

【问题讨论】:

  • 那么,从另一个方法调用有什么好处呢?构造函数只是在产生new 运算符的结果之前调用的方法

标签: c# asp.net-mvc-3


【解决方案1】:

你不会重复自己。

实现一个构造函数的更改也会立即影响所有其他构造函数。 复制和粘贴代码是不好的,应该避免。

【讨论】:

【解决方案2】:

与方法重载相同的优势:无需重复相同的代码

public class Person
{
    public Person(string name,string lastName )
    {
        Name = name;
        LastName = lastName;
    }

    public Person(string name, string lastName,string address):this(name,lastName)
    {
        //you don't need to set again Name and Last Name
        //as you can call the other constructor that does the job
        Address = Address;
    }
    public string Name { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
}

【讨论】:

    【解决方案3】:

    查看已经发布的答案,我会告诉他们你总是从默认构造函数一直走到最专业的构造函数。试图反过来做同样的事情总是会导致代码重复或问题:

    好办法:

    public class Foo()
    {
        public Foo()
          : this(String.Empty)
        { }
    
        public Foo(string lastName)
          : this(lastName, String.Empty)
        { }
    
        public Foo(string lastName, string firstName)
          : this(lastName, firstName, 0)
        { }
    
        public Foo(string lastName, string firstName, int age)
        {
            LastName = lastName;
            FirstName = firstName;
            Age = age;
            _SomeInternalState = new InternalState();
        }
    }
    

    坏方法:

    public class Foo()
    {
        public Foo(string lastName, string firstName, int age)
          : this(lastName, firstName)
        {
            Age = age;
        }
    
        public Foo(string lastName, string firstName)
          : this(lastName)
        {
            FirstName = firstName;
        }
    
        public Foo(string lastName)
          : this()
        {
            LastName = lastName;
        }
    
        public Foo()
        {
            _SomeInternalState = new InternalState();
        }
    }
    

    第二个例子的问题是,如何处理所有参数的部分现在被所有构造函数弄乱了,而是只在一个(最专业的)中实现。想象一下你喜欢从这个类派生。在第二个示例中,您必须覆盖所有构造函数。在第一个示例中,您只需覆盖最专业的构造函数即可完全控制每个构造函数。

    【讨论】:

    • 我不喜欢这个例子。您可能应该以另一种方式级联。从最高的参数数量到最低的参数
    • @Kyle: NNNOOOOOOOO。按照您的建议进行操作会导致问题。请参阅我的更新答案。
    • 不确定我是否明白这一点...如果Foo 是父类并且您有类Bar : Foo 并且您想实现Bar(last, first) : base(last, first) 我认为这两种方法都没有问题.我会说第一种方法可以很好地将所有参数设置在一个地方,只是为了寻找,但它并没有涵盖您可能想要链接构造函数的 所有 情况。想象一下两个在设置过程中调用不同方法的构造函数,它们具有共同的“基础”实现,但不应相互调用
    【解决方案4】:

    如果您想将默认值传递给基本构造函数。

    public class YourClass
    {
        private int SomeInt;
    
        public YourClass() : this(0)
        {
            // other possible logic
        }
    
        public YourClass(int SomeNumber)
        {
            SomeInt = SomeNumber;
        }
    }
    

    这遵循 DRY 原则(不要重复自己)。一个简单的例子,但它应该能说明这个想法。

    【讨论】:

      【解决方案5】:

      当我想将默认值或空值传递给其他构造函数时,我使用了它。在上述情况下,用户在调用构造函数时不必传递 null —— 他们可以一无所有地调用它。

      public class Widget(){
      
          public Widget() : this(null){
      
          }
      
          public Widget(IRepository rep){
            this.repository = rep;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-14
        • 2011-03-24
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 2016-07-03
        • 2012-06-22
        • 2015-07-02
        相关资源
        最近更新 更多