VB.NET中的依赖类型

时间:2011-09-14 17:08:27

标签: vb.net inheritance overloading

我想知道是否可以在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

1 个答案:

答案 0 :(得分: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