【问题标题】:How do you handle shared members when dealing with interfaces?在处理接口时如何处理共享成员?
【发布时间】:2011-11-28 14:43:06
【问题描述】:

所以我做了大量的工作,试图为一组通用的类创建一个接口。这个想法是创建一个每个类都可以在集合中使用的接口,但最终每个类都是不同的。原来接口不喜欢共享成员。我尝试了什么:

Public Interface ISomeInterface
Shared Property Meta() as Object
End Interface


Public Class A

Implements ISomeInterface
Shared Public Property Meta() as Object Implements ISomeInterFace.Meta
'Set/get methods
End Propery

Public Function Haduken() as Object
'perform Haduken
End Function
End Class


Public Class B

Implements ISomeInterface
Shared Public Property Meta() as Object Implements ISomeInterFace.Meta
'Set/get methods
End Propery

Public Function SonicBoom() as Object
'perform sonic boom
End Function
End Class

显然,如果我在这方面做足了功课,我就会知道共享成员不能在接口中使用。我应该让各个类完全负责处理其共享成员吗?是否有另一种方法可以将与共享成员的耦合降至最低?大约有 20 个左右的类将实现一个接口。提前致谢。

【问题讨论】:

    标签: vb.net interface static properties decoupling


    【解决方案1】:

    解决此问题的最简单方法是使用接口的Private 实现,该接口简单地转发给Shared 成员

    Public Shared Property Meta As Object
      ' Get / Set methods
    End Property
    
    Private Property MetaImpl() as Object Implements ISomeInterFace.Meta
      Get 
        return Meta
      End Get
      Set
        Meta = Value
      End Set
    End Propery
    

    此模式允许您维护相同的面向公众的 API 并仍然实现接口。

    【讨论】:

    • 界面会是什么样子? Public Interface ISomeInterface Private Property MetaImpl() as Object End Interface
    • @hydroparadise 对于这种模式,界面根本不需要改变
    • 这个问题是你需要实例化派生类来访问共享成员。
    【解决方案2】:

    如果想法是接口的每个实现都应该使用自己的共享变量,那么 JaredPar 的方法是正确的。如果想法是接口的所有用户都应该看到相同的共享变量,而不管他们拥有什么实例(如果有的话),那么正确的方法是创建一个名称与接口相似的类,并使用那堂课。这是例如使用的方法。 Enumerable.Empty 或 Comparer.Default.

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多