2009-04-15 44 views
7

Tôi có một vài loại có nguồn gốc từ đơn giản Base như được hiển thị bên dưới.Quá tải hàm tạo "cơ sở" hoặc hàm tạo "này"?

Tôi không chắc liệu có nên sử dụng hàm tạo của lớp cơ sở hay hàm tạo this khi quá tải các hàm tạo.

ConcreteA quá tải nhà xây dựng hoàn toàn bằng base nhà thầu, trong khi
ConcreteB quá tải sử dụng this cho hai định nghĩa chồng đầu tiên.

Điều gì sẽ là cách tốt hơn để quá tải nhà thầu?

public abstract class Base 
{ 
    public string Name { get; set; } 
    public int? Age { get; set; } 

    protected Base() : this(string.Empty) {} 
    protected Base(string name) : this(name, null) {} 
    protected Base(string name, int? age) 
    { 
     Name = name; 
     Age = age; 
    } 
} 

public class ConcreteA : Base 
{ 
    public ConcreteA(){} 
    public ConcreteA(string name) : base(name) {} 
    public ConcreteA(string name, int? age) : base(name, age) 
    { 
    } 
} 

public class ConcreteB : Base 
{ 
    public ConcreteB() : this(string.Empty, null){} 
    public ConcreteB(string name): this(name, null){} 
    public ConcreteB(string name, int? age) : base(name, age) 
    { 
    } 
} 

[Chỉnh sửa] Dường như những gì Ian Quigley đã đề xuất trong mình answer dường như có ý nghĩa. Nếu tôi có cuộc gọi khởi tạo trình xác thực, ConcreteA(string) sẽ không bao giờ khởi chạy trình xác thực trong trường hợp sau.

public class ConcreteA : Base 
{ 
    public ConcreteA(){} 
    public ConcreteA(string name) : base(name) {} 
    public ConcreteA(string name, int? age) : base(name, age) 
    { 
     InitializeValidators(); 
    } 
    private void InitializeValidators() {} 
} 

Trả lời

5

Điều này. Bởi vì nếu bạn đã bao giờ đặt mã trong ConcreteB (string, int?) Thì bạn muốn chuỗi chỉ xây dựng để gọi nó.

+0

Điều này có vẻ hợp lý nếu tôi có các khởi tạo khác đang diễn ra trong các nhà thầu cụ thể. – Sung

+0

Có và "điều này" sẽ luôn gọi "cơ sở" vào cuối ngày. Vì vậy, ngay cả khi "điều này" không có gì, nó sẽ thả xuống "cơ sở" –

1

Trong trường hợp của bạn từ những gì bạn đã cung cấp thì không quan trọng. Bạn thực sự chỉ muốn sử dụng this khi bạn có một hàm tạo trong lớp hiện tại của bạn không phải là một phần của lớp cơ sở của bạn, hoặc nếu có một số mã trong hàm tạo lớp hiện tại mà bạn muốn thực thi không có trong lớp cơ sở .

2

Nói chung, tôi muốn gọi "này" thay vì "cơ sở". Có thể bạn sẽ sử dụng lại nhiều mã theo cách đó, nếu bạn mở rộng các lớp của mình sau này.

0

Để giảm độ phức tạp của đường dẫn mã, tôi thường cố gắng thực hiện chính xác một cuộc gọi hàm gọi là base() (trường hợp ConcreteB). Bằng cách này bạn biết rằng việc khởi tạo của lớp cơ sở luôn luôn xảy ra trong cùng một thời trang.

Tuy nhiên, tùy thuộc vào lớp bạn ghi đè, điều này có thể không thực hiện được hoặc thêm độ phức tạp không cần thiết. Điều này đúng với các mẫu hàm tạo đặc biệt, chẳng hạn như khi triển khai thực hiện ISerializable.

2

Bạn nên trộn và kết hợp; cuối cùng, khi bạn sử dụng một hàm tạo this(...), nó sẽ cuối cùng là đến một ctor gọi số base(...) trước tiên. Nó có ý nghĩa để tái sử dụng logic khi cần thiết.

Bạn có thể sắp xếp nó sao cho tất cả các hàm tạo được gọi là hàm xây dựng chung (có thể riêng) là this(...) là duy nhất gọi đến base(...) - nhưng điều đó tùy thuộc vào việc: : cho dù có một đơn vị duy nhất base(...) ctor sẽ cho phép bạn.

0

Hãy tự hỏi tại sao bạn đang quá tải hàm tạo trong lớp Cơ sở? Cái này là đủ:

protected Base() 

Cùng đi cho các lớp con trừ khi bạn cần một trong hai lĩnh vực để có một giá trị đặc biệt khi bạn nhanh chóng mà trong ví dụ của bạn không phải là trường hợp kể từ khi bạn đã có nhà xây dựng mặc định.

Cũng nên nhớ rằng bất kỳ nhà xây dựng nào cũng nên đặt cá thể của đối tượng ở trạng thái chính xác.

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