2011-09-14 76 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)中是一個衆所周知的概念。 例如,在支持依賴類型的一個假想的命令式語言,可以寫成:

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

編輯:考慮您的意見,我不知道有關依賴類型。看起來這些還沒有在任何面向對象的編程語言中實現。有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,沒有人知道工廠之外,以及構造的對象,它們的實際類型是什麼(如果我們不考慮反射和鑄造,那在這一點上會混淆不清)。你應該修改你的對象層次結構來封裝你的兩種類之間的差異。

你的代碼的完整工作重構應該是這樣的:

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