2011-09-14 13 views
2

VB.Net 4で従属型を持つことが可能かどうか、または基本クラスのコンストラクタのパラメータに基づいて継承されたオブジェクトを構築できるかどうかは疑問でした。例えば、VB.NETの従属型

Class BaseClass 
    Sub New(type as String) 
     If type = "One" then 
      Me = New Child1 'Assignment to Me is syntax error, but it explains the concept... 
     Else 
      Me = New OtherChild 
     End If 
    End Sub 
End Class 

Class Child1 
    Inherits BaseClass 
... 

Class OtherChild 
    Inherits BaseClass 
.. 

.. 
Sub Main() 
    Dim c1 As New BaseClass("One") 
    Dim c2 As New BaseClass("Two") 
    OverloadedMethod(c1) 'Outputs One 
    OverloadedMethod(c2) 'Outputs Two 
End Sub 

Sub OverloadedMethod(C as Class1) 
    Console.Write("One") 
End Sub 

Sub OverloadedMethod(C as OtherClass) 
    Console.Write("Two") 
End Sub 

EDIT:依存型について説明:

Dependent typesは、いくつかのパラメータ(例えばスカラー値)に基づいて構築されているタイプです。これは、一部の(主に機能的な)プログラミング言語(例えば、Haskell)におけるよく知られた概念である。 例えば、依存タイプをサポートして仮想的な命令型言語では、1は書くことができます。

Matrix(3,10) A; //A is a 10x10x10 3D Matrix 
Matrix(2,3) B; //B is a 3x3 2D Matrix 

そして

A(0,0,0) = 10; 
B(0,0) = -2; 
B(1,1,0) = 5; // Type Error 

答えて

4

EDIT:あなたのコメントを考えると、私は依存型について認識していませんでした。これらはまだオブジェクト指向プログラミング言語では実装されていないようです。そのうちの2つを組み合わせることについてresearchがありますが、まだAFAIKの実装段階にはいないようです。

現時点では、constructorは、構成中のタイプ以外のものを作成できません(例:BaseClass)。

最も近い数字はabstract factoryです。それは(私は文字列を保持し、簡素化のための方法は、静的作られたが、それは通常、パターンの一部ではない、詳細についてはそれについて読んで)次のようになります。

Class ClassFactory 
     Public Shared Function GenerateBaseClassObject(type As String) As BaseClass 
     If type = "One" Then 
      Return New Child1 
     Else 
      Return New OtherChild 
     End If 
     End Function 
    End Class 

あなたの他の部分にあなたのオブジェクト階層外でメソッドを定義するのが難しくなります。ご覧のように、抽象的なファクトリはBaseClassを返します。ファクトリの外側と構築されたオブジェクトは誰も知りません。実際のタイプは何ですか(リフレクションとキャストは考慮しないと、この時点で混乱します) )。 2種類のクラスの違いをカプセル化するために、オブジェクト階層を再構築する必要があります。

あなたのコードの完全な作業リファクタリングは、次のようになります。

MustInherit Class BaseClass 
     Public MustOverride Sub Output() 
    End Class 

    Class Child1 
     Inherits BaseClass 

     Public Overrides Sub Output() 
     Console.Write("One") 
     End Sub 
    End Class 

    Class OtherChild 
     Inherits BaseClass 

     Public Overrides Sub Output() 
     Console.Write("Two") 
     End Sub 
    End Class 

    Class ClassFactory 
     Public Shared Function GenerateBaseClassObject(type As String) As BaseClass 
     If type = "One" Then 
      Return New Child1 
     Else 
      Return New OtherChild 
     End If 
     End Function 
    End Class 

    Sub Main() 
     Dim c1 As BaseClass = ClassFactory.GenerateBaseClassObject("One") 
     Dim c2 As BaseClass = ClassFactory.GenerateBaseClassObject("Two") 
     c1.Output() 
     c2.Output() 
     Console.ReadLine() 
    End Sub