【问题标题】:Dependent types in VB.NETVB.NET 中的依赖类型
【发布时间】:2011-09-14 17:08:26
【问题描述】:

我想知道在 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

【问题讨论】:

    标签: vb.net inheritance overloading


    【解决方案1】:

    编辑:考虑到您的 cmets,我不知道依赖类型。似乎这些还没有在任何面向对象的编程语言中实现。有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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-19
      • 2019-03-12
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多