我想知道是否可以在VB.Net 4中使用依赖类型,或者,如果可以基于基类的构造函数的参数构造继承的对象。例如,
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
编辑:关于依赖类型的说明:
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
答案 0 :(得分:4)
目前,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