2011-09-28 42 views

Trả lời

3

Đó hoàn toàn là một thực hành tốt vì hai lý do chính:

Để tránh việc lặp lại code

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){} 
} 

Để thực thi đóng gói tốt

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

Bất kỳ ý kiến ​​về lý do tại sao là nó chỉ có sẵn cho nhà xây dựng? Tại sao tôi không thể sử dụng cùng một kỹ thuật với các phương thức quá tải khác? –

2

Lý do chính là có thể sử dụng lại mã giữa các hàm tạo. Thay vì sao chép khởi tạo, bạn có thể đặt tất cả mã khởi tạo trong một hàm tạo duy nhất và gọi đó là một từ các hàm tạo khác.

0

Tôi đã nhìn thấy nó khi bạn đã có một số nâng nặng được thực hiện tại thời gian xây dựng, và bạn đã có rất nhiều cách khác nhau của việc tạo ra các đối tượng. (Vì vậy, số ít các ctors với các chữ ký tham số khác nhau).

Bạn chỉ có thể có một chức năng thành viên riêng làm công việc phổ biến trên các ctors. Bạn không thực sự cần phải có một ctor gọi khác trong cùng một lớp học. (Mà thậm chí không được phép trong hầu hết các ngôn ngữ).

1

'Constructor Chaining' là một cách tiếp cận nhờ đó một hàm tạo gọi một hàm tạo khác trong cùng một cla ss Điều này đặc biệt hữu ích khi chúng ta có một lớp định nghĩa nhiều hàm tạo. Ví dụ, chúng ta đang tạo một lớp có tên là Person trong ví dụ dưới đây. Chúng tôi cũng có ba lĩnh vực mà chúng tôi có thể sử dụng; Tuổi, Tên và Màu tóc. Lớp này có ba hàm tạo. Nếu chúng ta không sử dụng cách tiếp cận 'Constructor Chaining', mã sẽ là một cái gì đó như dưới đây:

Không Sử dụng Constructor Chaining:

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; 
     } 

    } 

Như bạn có thể thấy, trong mỗi nhà xây dựng chúng ta đang gán một giá trị thành Độ tuổi, trùng lặp mã. Chúng tôi cũng đã gán một giá trị cho Tên trong hai trong số các hàm tạo, vì vậy một lần nữa sao chép nhiều hơn. Để loại bỏ vấn đề này, chúng ta có thể gán tất cả các giá trị cho Age, Name và HairColour trong hàm tạo với hầu hết các tham số. Sau đó chúng ta có thể gọi hàm tạo đó khi hai hàm tạo khác được gọi. Xem mã bên dưới để xem cách tiếp cận ‘Chaining’ này.

Sử dụng Constructor Chaining:

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; 
     } 

    } 

Hy vọng rằng sẽ giúp - nó tiết kiệm về sự trùng lặp.

Một nữa 'cực đoan' dụ với rất nhiều lĩnh vực (và do đó rất nhiều sự trùng lặp tiềm năng) được hiển thị ở đây:

An example where it will definitely save on duplication

+1

Để giữ cho hành vi chính xác như nhau, bạn sẽ cần phải vượt qua 'null' thay vì' "" 'cho các nhà xây dựng xích –

Các vấn đề liên quan