在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
答案 0 :(得分:5)
本田比汽车更具体,可能包含其他功能或行为。你可以毫无问题地将一辆本田投入汽车,但不能将汽车投入本田。
编辑:例如,本田可能包含ActivateVTEC方法,而所有汽车都有加油方法,所以如果你能够创建一辆本田=新车,ActivateVTEC将是未定义的。
答案 1 :(得分:4)
你错了。你永远不能把A作为B。
这是有效的陈述:
Dim instance as A = New B
A
可以包含B的实例,而不是相反。
答案 2 :(得分:0)
由于您提及了类Honda
和Car
,因此您的示例有点混乱,但在代码中您有类A
和B
。
我假设你的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)。
您的示例中的 Honda
和B
在类层次结构中较低,为Car
和A
。这意味着他们至少拥有其基类的所有属性(又名超类或父类)。因此,编译器不能将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();