2017-02-15 17 views
5

Hãy xem xét các giao diện sau:Thực hiện một giao diện chung thiếu ràng buộc mới

public interface IFoo 
{ 
    M Bar<M>(); 
} 

Đang cố gắng để thực hiện điều đó với

class Foo : IFoo 
{ 
    public M Bar<M>() 
    { 
     return new M(); 
    } 
} 

không hoạt động, trình biên dịch phàn nàn các M thiếu chế new().

Khi tôi thêm các hạn chế như trong

class Foo : IFoo 
{ 
    public M Bar<M>() where M : new() 
    { 
     return new M(); 
    } 
} 

điều này vẫn không làm các trick, như những hạn chế của Foo.Bar không phù hợp với những hạn chế của phương pháp giao diện bây giờ (và tôi không thể thay đổi cái đó).

Các documentation for the compiler error CS0425 nói

Để tránh lỗi này, hãy chắc chắn rằng các mệnh đề where là giống hệt nhau trong cả hai tờ khai, hoặc thực hiện giao diện một cách rõ ràng.

Nếu "triển khai giao diện rõ ràng" là giải pháp: Làm cách nào để thực hiện?

+0

Đây có phải là vì bạn cần trả lại tài khoản mới hoặc bạn cần trả lại thứ gì đó khi không có gì khác để trả lại? 'Default (M)' có đủ tốt không? Nó trả về giá trị mặc định cho một kiểu generic đã cho, cho các tham chiếu này là 'null'. Nếu không, bạn sẽ cần một trong hai cây biểu thức hoặc sự phản chiếu để tạo ra cá thể của bạn. –

Trả lời

6

Nếu bạn không thể thay đổi định nghĩa giao diện, bạn sẽ phải tránh sử dụng new M(); - sử dụng Activator.CreateInstance thay vì:

class Foo : IFoo 
{ 
    public M Bar<M>() 
    { 
     return Activator.CreateInstance<M>(); 
    } 
} 

Tất nhiên, bây giờ bạn có thể chạy vào một lỗi thời gian chạy nếu không có constructor parameterless cho M, nhưng điều đó không thể tránh khỏi (một lần nữa, bởi vì chúng ta không thể thay đổi các ràng buộc chung).


Re: tài liệu:

thực hiện giao diện một cách rõ ràng.

tôi nghĩ rằng những gì họ đang cố gắng để có được ở đây là "nếu bạn đã có một phương pháp lớp cơ sở có một tập các ràng buộc chung và bạn muốn thực hiện một giao diện mà có một bộ khác nhau của các ràng buộc cho một phương thức có cùng tên, việc thực hiện rõ ràng là một cách thoát khỏi ràng buộc đó ".

+0

Cảm ơn bạn đã diễn giải tài liệu: Có lẽ bạn đang đúng. Tôi đã ở chế độ suy nghĩ "tài liệu giải thích những gì tôi đã làm sai và cho thấy một lối thoát khỏi hoàn cảnh", dẫn tôi đi sai đường. – mkluwe

0

Bạn có thể tạo triển khai giao diện rõ ràng bằng cách nhấp chuột phải vào giao diện trong lớp nên triển khai giao diện và chọn "triển khai rõ ràng". Tên phương thức nên được đặt trước với tên giao diện.

5

Triển khai giao diện rõ ràng là không phải là giải pháp. Trình biên dịch đơn giản chỉ cho bạn biết rằng nếu bạn cần một phương thức chung là Bar với ràng buộc đó, thì thực hiện giao diện một cách rõ ràng để cả hai phiên bản của Bar có thể cùng tồn tại, nhưng đó rõ ràng không phải là giải pháp mà bạn đang tìm kiếm.

Các giải pháp duy nhất là:

  1. Thực hiện các loại hạn chế chung trong giao diện.
  2. Khởi tạo M mới thông qua phản ánh: Activator.CreateInstance và thanh toán giá mất an toàn loại tại thời gian biên dịch; không có gì thi hành M để có một hàm tạo parameterless.
+0

Không có gì đang thi hành 'M' thậm chí là một kiểu mà bạn có thể khởi tạo, có thể là một giao diện. –

+0

@AdamHouldsworth Vâng vâng, mọi loại không thể loại bỏ được đều thiếu một hàm tạo tham số có thể sử dụng được. Tôi không thấy sự khác biệt mà bạn đang cố gắng thực hiện. – InBetween

+0

Không có sự khác biệt, chỉ cần chỉ ra rằng không có constructor parameterless là ít nhất của các vấn đề thực sự - một quan sát nhiều hơn bất cứ điều gì. Chỉ cần nhắc tôi tại sao tôi không có xu hướng tạo hoặc sử dụng các giao diện như thế này. –

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