【问题标题】:Can I override variables declared in a class using VB.NET?我可以覆盖在使用 VB.NET 的类中声明的变量吗?
【发布时间】:2011-05-26 15:07:34
【问题描述】:

我正在尝试为通用事件创建通用控制器类。但是这些这些事件仍然需要访问它们的类变量。所以我的想法是使用 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

【问题讨论】:

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


    【解决方案1】:

    感谢polymorphism,您没有理由必须这样做。

    ModelDerivedClass1ModelDerivedClass2 都继承自ModelBaseClass,因此将基类中的变量声明为ModelBaseClass 类型将允许您存储任何这些类型的对象。在基类型ModelBaseClass 中定义的任何方法都自动在派生类型上可用。如果您需要调用仅在其中一种派生类型中定义的方法,则需要将对象向上转换为更具体的类型:

    DirectCast(_ClassVar, ModelDerivedClass1)
    


    作为对您问题的更具体和字面的回答,您不能覆盖变量声明。您必须将它们声明为属性才能覆盖它们的声明,即使那样,您也不能仅通过返回类型覆盖。

    【讨论】:

      【解决方案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
      

      【讨论】:

      • -1 过于复杂而没有意识到不需要像 OP 试图实现的 _ClassVar 或“显式”多态性。
      • 这并不过分复杂化。 Generics 最简单的格式。
      • 得说,我没有看到通用方法的问题。 Cody grays 的回答或 decyclones 都可以。 Cody 的方法需要更多的转换,如果 Controller 必须利用特定于每个派生类的模型中的功能,+MIGHT+ 提供一些有限的好处,但仅此而已。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2023-03-26
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多