在vb.net中使用私有方法实现接口

时间:2009-01-12 17:46:48

标签: vb.net interface

我对此感到震惊。有人可以解释为什么这有效吗?何时使用它的一个很好的例子也很不错。

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

3 个答案:

答案 0 :(得分:11)

拥有一个私有接口实现基本上只允许您实现一个接口,而不必混淆您的类'API。您可以实施IFoo,但只有将您视为IFoo的API才需要知道。

MSDN

  

您可以使用私有成员来实现接口成员。当私有成员实现接口的成员时,该成员通过接口变为可用,即使它不能直接在该类的对象变量上使用。

答案 1 :(得分:6)

  

我对此感到震惊。有人可以解释为什么这有效吗?何时使用它的一个很好的例子也很不错。

这个概念非常类似于C#的显式接口实现。如果您明确地将该类型强制转换为该接口,那么您也只能访问该接口的成员。

我无法评论为什么 .NET框架团队认为这个功能确实是必要的。它有时可能会加强封装,但我不确定这一点。在任何情况下,使用合成而不是(接口)继承总是可以实现非常相似的东西。

答案 2 :(得分:2)

问题的第一部分已在其他帖子中介绍,但我没有看到一个例子。我通常在实现通用接口及其非通用接口时使用它。例如,如果我想创建一个通用的ObservableList,我想要实现两个IList接口。

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

当两个IList都被实现时,我们最终会有很多重复的功能。有些共享相同的签名,可以实现像Clear这样的IList函数。但是一些非泛型函数处理对象而不是泛型。因此,对于Add函数,我会使两个实现都工作,但是将非泛型版本设置为private,以便更容易使用该类。

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

这样,类可以被传递并用作IList,但是编码器可以将它用作IList(Of T),而不会出现潜在的过载混乱。