2010-12-16 68 views
1

我正在尝试为通用事件创建一个通用控制器类。但是这些事件仍然需要访问它们的类变量。所以我的想法是创建带有ModelBaseclass变量的基础控制器类,作为_ClassVar,它由所有其他类Controller类继承而来。但是我希望派生控制器类可以用他们需要的任何一个覆盖_ClassVar。我可以重写使用VB.NET在类中声明的变量吗?

我想这样做,所以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

如何使用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 
+0

-1 Overcomplicates没有意识到,没有必要_ClassVar或“明确的”多态性像OP试图实现。 – siride 2010-12-16 16:12:16

+0

这并不过分复杂。它的'泛型'以最简单的格式。 – decyclone 2010-12-16 16:15:52

+0

得说,我没有看到通用方法的概率。无论是科迪灰色的回答还是解码器都可以工作。 Cody的方法需要更多的投射,+ + MIGHT +提供一些有限的好处,如果控制器必须在特定于每个派生类的模型中使用功能,但就是这样。 – DarinH 2010-12-16 17:47:43

4

感谢polymorphism,没有理由你应该做到这一点。

两个ModelDerivedClass1ModelBaseClassModelDerivedClass2继承,所以宣布在你的基类为ModelBaseClass类型变量将允许你存储的任何这些类型的对象。基类型ModelBaseClass中定义的任何方法都可以在派生类型中自动使用。如果您需要调用仅在派生类型之一定义的方法,你需要的对象上溯造型为更具体的类型:

DirectCast(_ClassVar, ModelDerivedClass1) 


作为一个更具体和文字回答你问题,你不能覆盖变量声明。您必须将它们声明为属性才能覆盖它们的声明,即使如此,也不能仅仅通过返回类型进行覆盖。

相关问题