2013-06-30 44 views
7

Tôi đang thử nghiệm với các ràng buộc chung. Khi khai báo một ràng buộc trên một lớp như vậy:C# Giao diện Contraints

public class DocumentPrinter<T> where T : IFooDoc 

Tôi có thể truy cập phương thức được khai báo bởi IFooDoc trong các phương thức của lớp DocumentPrinter. Tuy nhiên, nếu tôi làm DocumentPrinter thực hiện một giao diện mà tuyên bố contraint, ví dụ:

public interface IDocumentPrinter<T> where T : IFooDoc 
{ 
    void Add(T fooDoc); 
    void PrintFoos(); 
} 

và sau đó tuyên bố DocumentPrinter như vậy:

public class DocumentPrinter<T>: IDocumentPrinter<T> 

thuộc tính/phương pháp của trường IFooDoc không còn có sẵn trong các phương pháp của máy in Tài liệu. Dường như tôi phải khai báo rõ ràng ràng buộc giao diện trên chính lớp đó nếu tôi truy cập các thành viên được khai báo theo kiểu.

Tôi có hiểu điều này một cách chính xác hoặc có thể khai báo ràng buộc trên giao diện và có sự ràng buộc đó do lớp học thực hiện không?

Trả lời

8

Tôi có hiểu điều này một cách chính xác hoặc có thể khai báo ràng buộc trên giao diện và có hạn chế mà lớp đó thực hiện không?

Đúng. Bạn để khai báo ràng buộc về các thông số loại cho lớp chung. Chỉ vì bạn đã đặt tên tham số kiểu trong DocumentPrinter<T> để có cùng tên với thông số loại trong IDocumentPrinter<T> không có nghĩa là chúng cùng loại. Khi bạn khai báo

public class DocumentPrinter<T> : IDocumentPrinter<T> 

bạn đang ở trong thực tế nói để sử dụng T rằng parameterizes DocumentPrinter<T> để parameterize IDocumentPrinter<T>tại họ là các loại tương tự. Nhưng đối với điều đó là hợp pháp, T từ DocumentPrinter<T> phải đáp ứng tất cả các ràng buộc về thông số loại cho IDocumentPrinter<T>. Do đó, bạn phải nói rõ ràng rằng T thỏa mãn T : IFooDoc.

: Rõ ràng tôi cần nêu rõ điều này. Nếu bạn không làm điều gì đó, đặc tả ngôn ngữ yêu cầu bạn phải làm, mã của bạn sẽ không biên dịch. Đặc tả ngôn ngữ yêu cầu rằng khi bạn tham số hóa một kiểu generic, kiểu mà bạn tham số hóa nó phải đáp ứng tất cả các ràng buộc về tham số kiểu đó cho kiểu generic đó. Nếu không, mã của bạn sẽ không biên dịch.

+0

Điều này là gây hiểu lầm, bạn không phải thêm ràng buộc vào lớp để có thể truy cập vào các thành viên, bạn phải thêm nó cho mã để biên dịch. – svick

+0

@svick: Câu hỏi như đã nêu là "* Tôi có hiểu điều này một cách chính xác hoặc có thể khai báo ràng buộc trên giao diện và có sự ràng buộc mà lớp đó nhận ra không? *" Không chắc chắn câu trả lời của tôi là sai lạc. Nếu bạn * phải khai báo ràng buộc * như tôi đã chỉ rõ trên câu trả lời của tôi, có một ẩn * nếu bạn không, mã sẽ không biên dịch * vì bất cứ lúc nào bạn không làm điều gì đó mà ngôn ngữ * yêu cầu * bạn phải làm , bạn có mã sẽ không biên dịch. Nhưng một lần nữa, câu hỏi là * tôi có phải làm điều này không, hay có cách nào để làm điều đó mà không rõ ràng. * Tôi trả lời câu hỏi đó. Downovting? – jason

+0

Câu hỏi cho biết: “Có vẻ như tôi phải khai báo rõ ràng ràng buộc giao diện khi chính lớp đó * nếu tôi truy cập các thành viên được khai báo theo loại *.” Với tôi, điều đó cho thấy OP * không nhận ra mã đã thắng 't biên dịch *. Đó là lý do tại sao tôi nghĩ điều quan trọng là phải nhấn mạnh điều đó. – svick

3

thuộc tính/phương pháp của trường IFooDoc không còn có sẵn trong các phương pháp của máy in Document

Vâng, đó là loại không liên quan gì IntelliSense cho bạn khi mã của bạn không biên dịch.

Nếu bạn muốn triển khai IDocumentPrinter<T>, bạn phải thỏa mãn ràng buộc của nó. Nếu không, mã của bạn sẽ không biên dịch.