2013-05-27 40 views
8

Hãy nói rằng tôi có các nhà thầu sau đây cho Foo trong C#:có điều kiện gọi Constructor trong C#

public Foo() 
{ 
    // ... 
} 
protected Foo(bool connect) 
    : this() 
{ 
    // ... 
} 

tôi đang tìm kiếm một cách để chỉ thực hiện phần this() bất cứ khi nào các tham số connecttrue. Đây có phải là cách để làm điều này không?

(Đối với những người tò mò: Lý do đằng sau điều này là lớp Foo tạo ra các đối tượng kết nối với một số thứ nhất định, khi chúng được tạo ra, chúng luôn phải cố gắng kết nối. Ngay bây giờ, tôi đang tạo trình mô phỏng (hoặc MOCK) cho nó mở rộng các lớp học Foo.Đó là những gì tôi đang thêm các nhà xây dựng protected cho, khi một trong những được sử dụng, nên có tùy chọn để không tạo ra một kết nối thực tế.Tôi muốn thực hiện điều này trong khi thay đổi các lớp học Foo ít nhất có thể.)

Trả lời

7

không, bạn không thể gọi this() có điều kiện theo cách đó. Tuy nhiên, bạn có thể di chuyển các mã có điều kiện đến protected contructor và chỉ gọi đó là nhà xây dựng từ public một:

public Foo() : this(true) 
{ 

} 

protected Foo(bool connect) 
{ 
    if(connect) //... 
} 
+2

Cá nhân tôi ủng hộ cách tiếp cận này. Nó tránh được một nhược điểm của việc gọi một phương thức non-constructor, đó là các trường 'readonly' không thể được khởi tạo trong một non-constructor. Nó cũng quy mô cho nhiều nhà xây dựng (tất cả đều có thể gọi một nhà xây dựng "master" được bảo vệ hoặc thậm chí riêng) - mặc dù gọi phương thức init() cũng có quy mô. –

+0

Vâng, thực sự tôi nghĩ rằng đây là cách tốt nhất quá –

+0

Xem xét những gì @MatthewWatson nói, điều này thực sự có lẽ là câu trả lời đúng. Cảm ơn! –

6

Một cách để thực hiện, là tạo một hàm init():

public Foo() 
{ 
    // ... 
    init(); 
} 
protected Foo(bool connect) 
{ 
    // ... 
    if (connect) { 
     init(); 
    } 
} 
+0

Tôi đoán đây là cách tốt nhất để làm điều đó thực sự. Với 'init()' là private, lớp sẽ không thay đổi rõ ràng, đó chính xác là những gì tôi cần. –

2

Bạn có thể không gọi đây là() có điều kiện, do đó bạn phải sử dụng một phương pháp thay

public Foo() 
{ 
    ConnectCode(); 
} 
protected Foo(bool connect) 
    : this() 
{ 
    if(connect) 
     ConnectCode(); 
} 

Một cách khác (không biết nếu nó tốt hay nếu nó là ok cho nhu cầu của bạn) là:

public Foo(bool connect=true) 
{ 
    if(connect) 
     ConnectCode(); 
} 

Bằng cách này, mã mà gọi Foo() không cần phải được thay đổi nhưng bạn mất khả năng tiếp cận bảo vệ

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