2014-03-28 81 views
0

我有一個非常簡單和直接的問題。 調用一個類的另一個構造函數的標準方法或正確的方法是什麼,以及這樣的類的基類構造函數? 我知道第二個例子不起作用。這只是第三種方式,這似乎很難。那麼,設計C#的人希望用戶如何做到這一點?調用這個和基礎構造函數?

例如:

public class Person 
{ 
    private int _id; 

    private string _name; 

    public Person() 
    { 
     _id = 0; 
    } 

    public Person(string name) 
    { 
     _name = name; 
    } 
} 

// Example 1 
public class Engineer : Person 
{ 
    private int _numOfProblems; 

    public Engineer() : base() 
    { 
     _numOfProblems = 0; 
    } 

    public Engineer(string name) : this(), base(name) 
    { 
    } 
} 

// Example 2 
public class Engineer : Person 
{ 
    private int _numOfProblems; 

    public Engineer() : base() 
    { 
     InitializeEngineer(); 
    } 

    public Engineer(string name) : base(name) 
    { 
     InitializeEngineer(); 
    } 

    private void InitializeEngineer() 
    { 
     _numOfProblems = 0; 
    } 
} 
+0

dna的定義在哪裏? – dotNET

+0

編輯,而不是問題的重點。 –

回答

3

你能不能簡化通過使用optional parameter你的做法?

public class Person 
    { 
     public int Id { get; protected set; } 
     public string Name { get; protected set; } 
     public Person(string name = "") 
     { 
      Id = 8; 
      Name = name; 
     } 
    } 

    public class Engineer : Person 
    { 
     public int Problems { get; private set; } 
     public Engineer(string name = "") 
      : base(name) 
     { 
      Problems = 88; 
     } 
    } 

    [TestFixture] 
    public class EngineerFixture 
    { 
     [Test] 
     public void Ctor_SetsProperties_AsSpecified() 
     { 
      var e = new Engineer("bogus"); 
      Assert.AreEqual("bogus", e.Name); 
      Assert.AreEqual(88, e.Problems); 
      Assert.AreEqual(8, e.Id); 
     } 
    } 
+0

這樣做的問題是編譯器無法識別具有可選參數的方法/構造函數,因爲它具有與沒有可選參數的方法相同的簽名,所以如果嘗試重寫非可選參數方法/構造函數,它將無法工作。 –

+0

不確定你的意思?我已經使用單元測試更新了我的答案,該單元測試顯示了Engineer ctor設置了問題的名稱和數量,並將名稱設置鏈接到父級ctor。 – si618

+0

假設您沒有編寫person類,並且它不使用name作爲可選參數,而是使用必需的參數。 現在在工程師中,您希望創建一個新的構造函數,該構造函數也需要一個名稱,但是作爲一個可選參數。在這種情況下,對base(name)的調用將無法識別出所需的基類參數與工程師簽名具有相同的簽名。 –

相關問題