无法在Visual Basic中将对象强制转换为其父对象

时间:2011-08-19 14:23:04

标签: vb.net

在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

3 个答案:

答案 0 :(得分:5)

本田比汽车更具体,可能包含其他功能或行为。你可以毫无问题地将一辆本田投入汽车,但不能将汽车投入本田。

编辑:例如,本田可能包含ActivateVTEC方法,而所有汽车都有加油方法,所以如果你能够创建一辆本田=新车,ActivateVTEC将是未定义的。

答案 1 :(得分:4)

你错了。你永远不能把A作为B。

这是有效的陈述:

 Dim instance as A = New B

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

答案 2 :(得分:0)

由于您提及了类HondaCar,因此您的示例有点混乱,但在代码中您有类AB。 我假设你的C#代码

class Honda : Car {  }

在那种情况下

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

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

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

您的示例中的

HondaB在类层次结构中较低,为CarA。这意味着他们至少拥有其基类的所有属性(又名超类或父类)。因此,编译器不能将Base类隐式转换为更专业的类,尽管它可以隐式地将更专业的类转换为其基类。 这就是为什么将类型为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();