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

Posted

技术标签:

【中文标题】在 vb.net 中使用私有方法实现接口【英文标题】:implement an interface with a private method in vb.net 【发布时间】:2010-09-30 23:32:43 【问题描述】:

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

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】:

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

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

当两个 IList 都实现时,我们最终会得到很多重复的函数。有些共享相同的签名,并且可以实现两个 IList 函数,如 Clear。但是一些非泛型函数处理对象而不是泛型。所以对于 Add 函数,我会让这两个实现都工作,但将非泛型版本设置为私有,以便更轻松地使用该类。

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) 而不会出现潜在的过载混乱。

【讨论】:

【参考方案2】:

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

MSDN 说

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

【讨论】:

【参考方案3】:

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

这个概念非常类似于 C# 的显式接口实现。同样,如果您将类型显式转换为该接口,则只能访问该接口的成员。

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

【讨论】:

当成员为“private”时,它与 C# 的显式接口实现具有相同的目的,并且具有基本相同的语义(C#显式将等效于具有唯一性的 vb 样式的私有实现随机私人名称)。当使用Protected Overridable 函数实现接口时,vb 方法的最大好处就出现了。然后派生类可以根据父类的实现来实现接口,这在 C# 中是不可能的,除非添加额外的间接级别。

以上是关于在 vb.net 中使用私有方法实现接口的主要内容,如果未能解决你的问题,请参考以下文章

vb.net main 不允许设置私有变量[关闭]

你如何使用你的接口的私有方法?

java接口定义的方法是私有吗?

私有接口与私有方法 - 目标 c

为啥接受实现接口方法私有? [复制]

C#:使用实现私有接口的对象参数测试方法