我正在尝试为通用事件创建通用的Controller类。但是这些事件仍然需要访问它们的类变量。所以我的想法是创建一个带有ModelBaseclass变量的基本控制器类作为_ClassVar,它由所有其他类派生的类继承而来。但我希望派生的控制器类可以用他们需要的任何一个覆盖_ClassVar。
我想这样做,因此ControllerBaseClass可以包含所有派生类将使用的所有泛型函数。
型号:
Public Class ModelBaseClass
Public Overridable Function Foo() As String
Return "Name"
End Function
End Class
Public Class ModelDerivedClass1
Inherits ModelBaseClass
Public Overrides Function Foo() As String
Return "ModelDerivedClass1"
End Function
End Class
Public Class ModelDerivedClass2
Inherits ModelBaseClass
Public Overrides Function Foo() As String
Return "ModelDerivedClass2"
End Function
End Class
控制器:
Public Class ControllerBase
Public Overridable _ClassVar As ModelBaseClass <----
Public Function PrintFoo() As String
Return _ClassVar.Foo()
End Function
End Class
Public Class ControllerDerivedClass1
Inherits ControllerBase
Public Overrides _ClassVar As ModelDerivedClass1 <----
End Class
Public Class ControllerDerivedClass2
Inherits ControllerBase
Public Overrides _ClassVar As ModelDerivedClass2 <----
End Class
答案 0 :(得分:4)
感谢polymorphism,您没有必要这样做。
ModelDerivedClass1
和ModelDerivedClass2
都继承自ModelBaseClass
,因此将基类中的变量声明为类型ModelBaseClass
将允许您存储任何类型的对象。基类型ModelBaseClass
中定义的任何方法都可在派生类型上自动使用。如果需要调用仅在某个派生类型中定义的方法,则需要将对象更新为更具体的类型:
DirectCast(_ClassVar, ModelDerivedClass1)
作为对您的问题的更具体和文字的答案,您不能覆盖变量声明。您必须将它们声明为属性才能覆盖它们的声明,即使这样,您也无法通过返回类型专门覆盖它们。
答案 1 :(得分:2)
如何使用Generics
:
Public Class ControllerBase(Of T As ModelBaseClass)
Private _ClassVar As T
Public Property ClassVar() As T
Get
Return _ClassVar
End Get
Set(ByVal value As T)
_ClassVar = value
End Set
End Property
Public Function PrintFoo() As String
Return ClassVar.Foo()
End Function
End Class
Public Class ControllerDerivedClass1
Inherits ControllerBase(Of ModelDerivedClass1)
' No need to declare this
' Public Overrides _ClassVar As ModelDerivedClass1 <----
End Class
Public Class ControllerDerivedClass2
Inherits ControllerBase(Of ModelDerivedClass2)
' No need to declare this
' Public Overrides _ClassVar As ModelDerivedClass2 <----
End Class