2010-05-03 28 views
12

Trong khi làm việc trên bản nâng cấp, tôi tình cờ gặp một mã như thế này.Ngụ ý và triển khai rõ ràng giao diện

interface ICustomization 
    { 
     IMMColumnsDefinition GetColumnsDefinition(); 
    } 

    class Customization : ICustomization 
    { 
     private readonly ColumnDefinition _columnDefinition; 

     //More code here. 

     public ColumnsDefinition GetColumnsDefinition() 
     { 
      return _columnDefinition; 
     } 

     ColumnsDefinition ICustomization.GetColumnsDefinition() //redundant 
     { 
      return GetColumnsDefinition();    
     } 
    } 

Câu hỏi của tôi là: Có cần sử dụng giao diện 'rõ ràng' trong đoạn mã này không? Nó sẽ tạo ra bất kỳ vấn đề nếu tôi loại bỏ các phương pháp (thực hiện rõ ràng của giao diện) mà tôi đã đánh dấu "dư thừa" ở trên?

PS: Tôi hiểu rằng việc triển khai giao diện rõ ràng là rất quan trọng và có thể được sử dụng khi chúng tôi chỉ cấp quyền truy cập vào phương thức ở cấp giao diện và sử dụng hai giao diện có cùng chữ ký.

Trả lời

8

Yup. Có vẻ dư thừa.

Gọi điện thoại thông qua loại tham chiếu Tùy chỉnh và loại kết quả tham chiếu ICustomization trong cùng một hành vi. Nếu bạn muốn các cuộc gọi bên dưới hoạt động khác nhau, thì việc triển khai giao diện rõ ràng sẽ có ý nghĩa.

Customization oVar = new Customization(); 
oVar.GetColumnsDefinition(); // calls 1st method 
ICustomization iVar = obj; 
iVar.GetColumnsDefinition(); // calls 2nd method - explicit impl. 

Bạn nên xóa triển khai rõ ràng. Tuy nhiên, nếu bạn loại bỏ việc triển khai khác, bạn sẽ hạn chế các khách hàng như vậy mà họ không còn có thể gọi oVar.GetColumnsDefintion() - họ sẽ phải sử dụng một biến giao diện như được hiển thị ở trên.

4

Đối với thông tin, thời gian chính bạn thấy rằng mô hình cụ thể là khi (bất kỳ một trong):

  • phương pháp không rõ ràng là virtual hoặc abstract, cho lớp con override
  • chữ ký của Phương pháp public không phải là khá giống nhau, ví dụ: API công khai có loại trả lại cụ thể hơn (phổ biến cho những thứ như IEnumerable[<T>] hoặc ICloneable).
  • chúng tôi không muốn nó được public, nhưng chúng tôi muốn nó được dễ dàng callable trong vòng loại (mà không cần một nop-cast)

Trong trường hợp này nó thực sự trông không cần thiết.

+0

Tại sao việc triển khai ảo không rõ ràng là lý do để có triển khai rõ ràng? Và nếu bạn thực hiện cả hai và tạo ra một lớp con, điều gì sẽ xảy ra nếu bạn gọi phương thức trên một biến giao diện tham chiếu đến một đối tượng lớp con? Bạn có thể cung cấp một ví dụ? _hãy xem [câu hỏi của tôi] (http://stackoverflow.com/q/10165296/537956) ._ – comecme

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