【问题标题】:Cannot cast an object to its parent object in Visual Basic无法在 Visual Basic 中将对象强制转换为其父对象
【发布时间】:2011-08-19 14:23:03
【问题描述】:

在 C# 中,我们可以这样做:

Honda a = new Car(); 可以,但同样的方法在 Visual Basic.NET 中不起作用(我对 Visual Basic 还很陌生)

Dim a as Honda = new Car 并显示无法将“SampleApp.Car”类型的对象转换为“SampleApp.Honda”类型。

这里有什么问题?

这是我的示例代码:

Module Module1

    Sub Main()
        Dim a As B = New A
        Console.WriteLine(a.DoSOmething())
        Console.ReadLine()
    End Sub
End Module

Class A
    Public Overridable Function DoSOmething() As String
        Return "SOmething"
    End Function
End Class

Class B
    Inherits A

    Public Overrides Function DoSOmething() As String
        Return "Something else"
    End Function

End Class

【问题讨论】:

  • 如果您有 class Honda : Car { },您还应该在 C# 中使用 Honda a = new Car(); 获得类型转换错误如果您一致地命名类,并且在您的代码中使用 HondaCar。否则你可以在解释中使用BA。从你的问题中不清楚Honda Inherits Car虽然你会期望它。

标签: vb.net


【解决方案1】:

本田比汽车更具体,并且可能包含其他功能或行为。您可以毫无问题地将本田转为汽车,但不能将汽车转为本田。

编辑:例如,Honda 可能包含一个 ActivateVTEC 方法,而所有汽车都将具有一个 Refuel 方法,因此如果您能够创建 Honda = new Car,ActivateVTEC 将是未定义的。

【讨论】:

    【解决方案2】:

    你错了。您永远不能将 A 转换为 B。

    这将是有效的陈述:

     Dim instance as A = New B
    

    A 可以包含 B 的实例,而不是相反。

    【讨论】:

      【解决方案3】:

      您的示例有点混杂,因为您提到了 HondaCar 类,但在代码中您有 AB 类。 我在你的 C# 代码中假设你有

      class Honda : Car {  }
      

      这样的话

      Honda a = new Car(); // Cannot implicitly convert type 'Car' to 'Honda'
      

      正在尝试将Car 类型的对象分配给Honda 类型的引用。假设您有class Honda : Car { },因此您试图将父类型Car 的对象分配给子类型Honda 的引用。您的问题是“无法将对象转换为其 parent 对象”,但实际上您正在尝试根据您提供的代码和假设做相反的事情。
      因此,即使在 C# 中,您也应该得到 Cannot implicitly convert type 'Car' to 'Honda' 的编译器错误。它不应该像你说的那样工作。

      这是由于继承的工作方式,它适用于 VB 和 C#(以及其他 OO 语言,如 Java)。

      您的示例中的HondaB 在类层次结构中低于CarA。这意味着它们至少具有其基类(又名超类或父类)的所有属性。因此,编译器无法将基类隐式转换为更专业的类,尽管它可以将更专业的类隐式转换为其基类。 这就是为什么在没有显式类型转换的情况下将Car 类型的对象分配给Honda 类型的变量会导致编译器错误。但是,您可以将Honda 类型的对象分配给Car 类型的变量,或者将B 类型的对象分配给A 类型的变量,就像这样

      Dim myHonda as Car = New Honda()
      Dim bObject as A = New B()
      

      或在 C# 中

      Car myHonda = new Honda();
      A bObject = new B();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多