我已经搜索了几个小时,但我找不到任何解决办法,甚至找不到合适的办法。 我需要一种方法来强制执行,多个类都有一个共享成员。这个类不能继承另一个类,因为它们是实体数据模型类,我处理自动生成文件旁边的部分类文件。
我尝试使用接口,但接口不提供将成员声明为共享的选项。
我的尝试就像:
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
。
但我的第一个实现不强制执行共享属性,只强制执行普通属性。要调用普通属性,我需要一个该类型的实例,但这不是我搜索的方式。
也许这个问题有另一个解决方案。
答案 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