2012-01-13 35 views
12

Giả sử tôi có hai ctors này:Cuộc gọi là mơ hồ giữa các phương thức hoặc thuộc tính sau

public SomeClass(string a, Color? c = null, Font d = null) 
     { 
      // ... 
     } 

public SomeClass(string a, Font c = null, Color? d = null) 
     { 
      // ... 
     } 

~ và tôi làm điều này:

SomeClass sc = new SomeClass("Lorem ipsum"); 

tôi sẽ có được điều này: "Lỗi 1 cuộc gọi không rõ ràng giữa các phương pháp hoặc thuộc tính sau đây [...] "

Có vẻ như tôi không quan tâm đến kết quả cuối cùng (ít nhất là trong trường hợp cụ thể này) và với tôi đó là tất cả hat vấn đề ngay bây giờ), vì vậy lựa chọn của tôi để có được xung quanh này là gì?

CHỈNH SỬA 1: @oltman: Ví dụ đơn giản.

Tôi chỉ muốn để có thể viết

[...] new SomeClass("Lorem", Color.Green) 

thay vì

[...] new SomeClass("Lorem", null, Color.Green) 
+3

Có một lý do bạn có cả hai, hay đây chỉ là một ví dụ đơn giản? – oltman

Trả lời

21

Cả nhà xây dựng mất cùng số đối số, nhưng theo thứ tự khác. Vì bạn đã chỉ định các giá trị mặc định cho hai tham số hàm tạo nên trình biên dịch không thể phân biệt giữa hai quá tải khi đối số thứ hai không được cung cấp.

tôi sẽ tư vấn cho bạn để loại bỏ các nhà thầu hiện hành và thay thế như sau:

public SomeClass(string a, Color? color, Font font) 
{ 
    // constructor implementation 
} 

public SomeClass(string a) : this(a, null, null) {} 
public SomeClass(string a, Color color) : this(a, color, null) {} 
public SomeClass(string a, Font font) : this(a, null, font) {} 
+0

Công trình này hoạt động kỳ diệu và chính xác là những gì tôi đang tìm kiếm. –

7

Một cách để buộc nó để làm việc:

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null); 
+0

nó rất hữu ích khi bạn chỉ có một đối số – Eli

1

Bạn có thể tạo một constructor chỉ mất một vài chuỗi, và cập nhật các nhà thầu trên để làm cho thông số thứ hai của họ bắt buộc?

Nếu ý tưởng là bạn có thể xây dựng các đối tượng bằng cách luôn luôn cung cấp các chuỗi và sau đó tùy chọn cung cấp màu hoặc font chữ hoặc cả hai, làm thế nào về điều này:

public SomeClass(string a) 
     { 
      // ... 
     } 

public SomeClass(string a, Color? c) 
     { 
      // ... 
     } 

public SomeClass(string a, Font f, Color? d = null) 
     { 
      // ... 
     } 
0

tôi sẽ có được điều này: "Lỗi 1 cuộc gọi là mơ hồ giữa các phương thức hoặc thuộc tính sau [...]"

có vẻ như rõ ràng với tôi rằng nó không quan trọng cái nào tôi gọi là kết quả cuối cùng là như nhau

Cuộc gọi không rõ ràng. Mỗi hàm tạo là duy nhất - nó không quan trọng nếu cả hai tạo và trả về một cá thể, bởi vì có thể có logic khác nhau trong mỗi hàm tạo. Trình biên dịch vẫn không biết bạn đang xây dựng hàm tạo nào.

0

Đây là ví dụ hoàn hảo về anti-pattern, cách tốt nhất để tránh điều này là câu trả lời của @Phil Klein.

Dưới đây là một cú pháp để thông qua lớp như null:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font); 
Các vấn đề liên quan