2010-12-16 8 views
1

ジェネリックイベント用の汎用コントローラクラスを作成しようとしています。しかし、これらのイベントは依然としてクラス変数にアクセスする必要があります。ですから、私の考えはModelBaseclass変数をBaseClass変数として_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 

コントローラー:polymorphism

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

どのようにこの1のため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

+0

これは過度の複雑さではありません。最も単純な形式の 'Generics'です。 – decyclone

+0

私はジェネリックアプローチでprobを見ません。コーディーグレイスの答えかデシクローンのどちらかが機能します。コントローラがそれぞれの派生クラスに固有のモデルで機能を使用しなければならない場合、Codyの手法ではキャスティングが少し必要になり、+ MIGHT +ではいくつかの限定された利点を提供しますが、それはそれです。 – DarinH

4

おかげで、あなたがこれをしなければならない必要がある理由はありません。

両方ModelDerivedClass1ModelBaseClassからModelDerivedClass2継承ので、あなたは、これらのタイプのいずれかのオブジェクトを格納することができますタイプModelBaseClassとしてお使いのベースクラスの変数を宣言。ベースタイプModelBaseClassで定義されているメソッドは、派生タイプで自動的に使用できます。あなたに、より具体的でリテラルの答えとして

DirectCast(_ClassVar, ModelDerivedClass1) 


:あなたが唯一の派生タイプのいずれかで定義されているメソッドを呼び出す必要がある場合は、より具体的な型にオブジェクトをアップキャストする必要があります変数の宣言を上書きすることはできません。宣言をオーバーライドするにはプロパティとして宣言しなければならず、その場合でも排他的に戻り型でオーバーライドすることはできません。

関連する問題