我可以使用VB.NET覆盖在类中声明的变量吗?

时间:2010-12-16 15:24:09

标签: .net vb.net oop polymorphism class-design

我正在尝试为通用事件创建通用的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

2 个答案:

答案 0 :(得分:4)

感谢polymorphism,您没有必要这样做。

ModelDerivedClass1ModelDerivedClass2都继承自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