2011-09-28 82 views

回答

3

這是絕對主要有兩個原因一個很好的做法:

爲了避免重複代碼

class Foo 
{ 
    public Foo(String myString, Int32 myInt){ 
     //Some Initialization stuff here 
    } 

    //Default value for myInt 
    public Foo(String myString) : this(myString, 42){} 

    //Default value for both 
    public Foo() : this("The Answer", 42){} 
} 

要實施良好的封裝

public abstract class Foo 
{ 
    protected Foo(String someString) 
    { 
     //Important Stuff Here 
    } 
} 

public class Bar : Foo 
{ 
    public Bar(String someString, Int32 myInt): base(someString) 
    { 
     //Let's the base class do it's thing 
     // while extending behavior 
    } 
} 
+0

上爲什麼它僅適用於構造有何評論?爲什麼我不能對其他重載方法使用相同的技巧? –

2

的主要原因是要能夠構造之間重用代碼。您可以將所有初始化代碼放在一個構造函數中,並從其他構造函數中調用該代碼,而不是重複初始化。

0

我已經看到了它,當你有一些繁重的施工時間正在做的,和你有很多的創建對象的不同方式。 (所以少數具有不同參數簽名的ctors)。

你可以只是有一個私有成員函數,它不跨構建函數的共同工作。你並不需要在同一個班級中有一位同事打電話給另一位。 (甚至在大多數語言中都不允許)。

1

'構造鏈接' 是一個方法,構造函數在同一個cla中調用另一個構造函數SS。當我們有一個定義了多個構造函數的類時,這個特別有用。例如,我們在下面的例子中創建了一個名爲Person的類。我們也有三個領域,我們可以使用;年齡,姓名和HairColour。這個類有三個構造函數。如果我們不使用「構造鏈接」的方式,代碼會像下面:

不使用構造鏈接:

public class Person 
    { 
     private int Age; 
     private string Name; 
     private string HairColour; 


     public Person(int theAge) 
     { 
      Age = theAge; 
     } 

     public Person(int theAge, string theName) 
     { 
      Age = theAge; 
      Name = theName; 
     } 

     public Person(int theAge, string theName, string theHairColour) 
     { 
      Age = theAge; 
      Name = theName; 
      HairColour = theHairColour; 
     } 

    } 

正如你所看到的,在每一個構造函數,我們正在分配年齡值,重複代碼。我們還爲兩個構造函數中的Name賦予了一個值,所以再次有更多的重複。爲了消除這個問題,我們可以用參數最多的構造函數將所有值賦給Age,Name和HairColour。然後我們可以在調用其他兩個構造函數時調用該構造函數。看到下面的代碼來看看這個「鏈接」方法。

使用構造鏈接:

public class Person 
    { 
     private int Age; 
     private string Name; 
     private string HairColour; 


     public Person(int theAge):this(theAge, "", "") 
     { 
      //One parameter 
     } 

     public Person(int theAge, string theName):this(theAge, theName, "") 
     { 
      //Two Parameters 
     } 

     public Person(int theAge, string theName, string theHairColour) 
     { 
      //Three parameters 
      Age = theAge; 
      Name = theName; 
      HairColour = theHairColour; 
     } 

    } 

希望幫助 - 它節省了重複。

更「極端」例如,有很多領域(等許多潛在的重複的)的如下所示:

An example where it will definitely save on duplication

+1

爲了保持行爲完全相同,您需要將'null'而不是''「'傳遞給鏈式構造函數 –