2009-01-12 41 views
11

Tôi đã bị sốc bởi điều này. Ai đó có thể giải thích lý do tại sao điều này hoạt động? Một ví dụ hay về thời điểm sử dụng nó cũng sẽ tốt đẹp.thực hiện giao diện với phương thức riêng trong vb.net

Public Interface IFoo 
    Sub DoIt() 
End Interface 

Public Class Bar 
    Implements IFoo 

    Private DoIt() implements IFoo.DoIt 
End Class 

... 

Dim b as new Bar() 
b.DoIt() 'error 
CType(b, IFoo).DoIt() 'no error 
+1

Vì vậy, mã đó hoạt động? Tôi ngạc nhiên. Dường như rất trái với ý tưởng của một giao diện. – jcollum

Trả lời

11

Việc triển khai giao diện riêng về cơ bản chỉ cho phép bạn triển khai giao diện mà không cần phải lúng túng API của lớp học. Bạn có thể triển khai IFoo, nhưng chỉ các API đối xử với bạn là IFoo mới cần biết điều đó.

MSDN nói

Bạn có thể sử dụng một thành viên tư nhân để thực hiện một thành viên giao diện. Khi một thành viên riêng thực hiện một thành viên của một giao diện, thành viên đó sẽ có sẵn theo cách của giao diện mặc dù nó không có sẵn trực tiếp trên các biến đối tượng cho lớp đó.

6

Tôi đã bị sốc bởi điều này. Ai đó có thể giải thích lý do tại sao điều này hoạt động? Một ví dụ hay về thời điểm sử dụng nó cũng sẽ tốt đẹp.

Khái niệm này khá giống với triển khai giao diện rõ ràng của C#. Ở đó, bạn cũng chỉ có thể truy cập vào thành viên của giao diện nếu bạn đưa loại đó một cách rõ ràng vào giao diện đó.

Tôi không thể nhận xét về lý do tại sao nhóm framework .NET cảm thấy tính năng này thực sự cần thiết. Nó đôi khi có thể tăng cường đóng gói nhưng tôi không chắc chắn về điều này. Trong mọi trường hợp, một cái gì đó cực kỳ giống nhau sẽ luôn luôn có thể sử dụng thành phần thay vì (giao diện) thừa kế.

+0

Khi thành viên là "riêng tư", nó phục vụ cùng mục đích như thực hiện giao diện rõ ràng của C#, và về cơ bản cùng ngữ nghĩa (một C# rõ ràng sẽ tương đương với thực thi vb kiểu riêng với một tên riêng ngẫu nhiên duy nhất). Lợi ích to lớn của phương pháp tiếp cận của vb là khi triển khai các giao diện với các hàm 'Bảo vệ có thể bị chồng chéo '. Các lớp có nguồn gốc sau đó có thể thực hiện giao diện về việc thực hiện của cha mẹ, một cái gì đó mà không thể có trong C# mà không thêm một mức độ không liên quan. – supercat

2

Phần đầu tiên của câu hỏi được đề cập trong các bài đăng khác, nhưng tôi không thấy ví dụ. Tôi thường sử dụng điều này khi thực hiện các giao diện chung và các đối tác không chung chung của chúng. Ví dụ, nếu tôi muốn tạo một ObservableList chung, tôi muốn thực hiện cả hai giao diện IList.

Public Class ObservableList(Of T) 
    Implements INotifyCollectionChanged, 
       IList, 
       IList(Of T) 
End Class 

Khi cả hai ILists được triển khai, chúng tôi sẽ có rất nhiều chức năng trùng lặp. Một số chia sẻ cùng một chữ ký và có thể thực hiện cả hai chức năng IList như Clear. Nhưng một số hàm không chung chung đối phó với các đối tượng thay vì chung chung. Vì vậy, đối với hàm Add, tôi sẽ làm cho cả hai việc triển khai hoạt động, nhưng đặt phiên bản không chung chung riêng tư để làm cho việc sử dụng lớp dễ dàng hơn.

Public Sub Add(item As T) Implements System.Collections.Generic.ICollection(Of T).Add 
    'Add item to collection 
End Sub 

Private Function Add1(item As Object) As Integer Implements System.Collections.IList.Add 
    'Add item to collection 
End Function 

Bằng cách này, lớp này có thể được chuyển và được sử dụng làm IList, nhưng trình mã hóa sẽ sử dụng nó làm IList (T) mà không bị quá tải.

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