强制多个类具有特定的共享成员

时间:2018-05-08 09:09:20

标签: vb.net class interface shared

我已经搜索了几个小时,但我找不到任何解决办法,甚至找不到合适的办法。 我需要一种方法来强制执行,多个类都有一个共享成员。这个类不能继承另一个类,因为它们是实体数据模型类,我处理自动生成文件旁边的部分类文件。

我尝试使用接口,但接口不提供将成员声明为共享的选项。

我的尝试就像:

Public Interface IInterfaceA
    ReadOnly Property PropA as String
End Interface

Public Partial Class ClassA
    Implements IInterfaceA

    Public Shared ReadOnly Property SPropA As String
        Get
            Return "FixedValueStringForClassA"
        End Get
    End Property

    Public ReadOnly Property PropA As String Implements IInterfaceA.PropA
        Get
            Return SPropA
        End Get
    End Property
End Class 

Public Partial Class ClassB
    Implements IInterfaceA

    Public Shared ReadOnly Property SPropA As String
        Get
            Return "FixedValueStringForClassB"
        End Get
    End Property

    Public ReadOnly Property PropA As String Implements IInterfaceA.PropA
        Get
            Return SPropA
        End Get
    End Property
End Class 

所以我可以致电PropA会员一组类型,实现IInterfaceA

但我的第一个实现不强制执行共享属性,只强制执行普通属性。要调用普通属性,我需要一个该类型的实例,但这不是我搜索的方式。

也许这个问题有另一个解决方案。

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法强制某个类来实现共享成员。 但是,您可以从模块共享扩展方法。

最近我遇到了类似的问题,需要与多个类共享函数,但仍然可以将它们作为该类运行。我使用扩展方法解决了这个问题。

基本上它是如何工作的,模块扩展了实现接口的所有对象,可以方便地包含在模块中,该接口将包含模块需要从调用类访问的任何内容,模块将包含任何需要的东西在所有类之间共享

Public Module SharedProp
    Dim PropA As String

    <Extension()>
    Public Function GetPropA(Of T As IInterfaceA)(this As T) As String
        Return PropA
    End Function

    <Extension()>
    Public Sub SetPropA(Of T As IInterfaceA)(this As T, value As String)
        PropA = value
    End Function

    Public Interface IInterfaceA
        Property PropA As String
    End Interface
End Module

只要包含该模块,任何影响您界面的类都可以访问模块的扩展方法,而这些方法又可以访问模块的隐式共享成员

Imports SharedProp

Public Partial Class ClassA
    Implements IInterfaceA

    Public Property PropA As String Implements IInterfaceA.PropA
        Get
            Return Me.GetPropA()
        End Get
        Set(value As String)
            Me.SetPropA(value)
        End Set
    End Property
End Class

Public Partial Class ClassB
    Implements IInterfaceA

    Public Property PropA As String Implements IInterfaceA.PropA
        Get
            Return Me.GetPropA()
        End Get
        Set(value As String)
            Me.SetPropA(value)
        End Set
    End Property
End Class

希望有助于解决您的问题!

编辑:基于类共享而不是接口

Public Module SharedProp
    Dim PropA As Dictionary(Of Type, String)

    <Extension()>
    Public Function GetPropA(Of T As IInterfaceA)(this As T) As String
        If PropA.ContainsKey(GetType(T)) Then
            Return PropA(T)
        Else
            Return Nothing
    End Function

    <Extension()>
    Public Sub SetPropA(Of T As IInterfaceA)(this As T, value As String) As String
        If PropA.ContainsKey(GetType(T) Then
            PropA(T) = value
        Else
            PropA.Add(GetType(T), value)
        End If
    End Function

    Public Interface IInterfaceA
        Property PropA As String
    End Interface
End Module