当我创建Vehicle类的实例时,我收到System.StackOverflowException。我相信它正在发生,因为我有一个继承自Vehicle的Car类的对象引用,它被卡住了无限循环。
Public Class Vehicle
Public Car As New Car
End Class
Public Class Car
Inherits Vehicle
Public Sub doStuff()
'does stuff
End Sub
End Class
虽然可能是不好的做法,但我的结构是这样的,因为我需要能够从另一个文件访问doStuff()
而无需创建Car
的实例,如下所示:
'some other file
Public Class Foo
Private Vehicle As New Vehicle
Vehicle.Car.doStuff() 'this is what I am trying to accomplish
End Class
还有其他方法可以实现这个目标吗?
编辑:由于似乎有点混乱,我想澄清一下,我有多个继承自Vehicle(Car,Truck,Bike等)的类。所有这些类都有自己独特的方法,但都需要使用Vehicle的一些方法和属性。使用virtual
并不是我想要的,因为我不需要覆盖任何方法。
答案 0 :(得分:3)
好吧,我认为这可能是对你想要派生课程的误解。让我举一个使用你的两个类的例子:
Public Class Vehicle
Public Sub DoVehicleStuff()
' code here
End Sub
Public Overridable Sub OverridableVehicleStuff()
'code here
End Sub
End Class
Public Class Car
Inherits Vehicle
Public Sub DoCarStuff()
'code here
End Sub
Public Overrides Sub OverridableVehicleStuff()
'code here
End Sub
End Class
好的,Vehicle有两个功能 - 其中一个是可覆盖的',这意味着它在那里,但派生类可以覆盖它。然后,Car继承自Vehicle - 这意味着它获得相同的DoVehicleStuff()和OverridableVehicleStuff()。但是它添加了一个额外的函数DoCarStuff()并用它自己的函数版本替换了OverridableVehicleStuff。
总而言之,我们可以使用这样的类:
Dim myVehicle As Vehicle = New Vehicle()
myVehicle.DoVehicleStuff()
myVehicle.OverridableVehicleStuff() ' does the VEHICLE version of the function
'this will not compile: myVehicle.DoCarStuff() - because vehicles do not have that function. It is in the car sub-class.
Dim myCarStoredInVehicle As Vehicle = New Car()
myCarStoredInVehicle.DoVehicleStuff() 'I can still use this function - because Car inherited it
myCarStoredInVehicle.OverridableVehicleStuff() 'this will do the CAR version of the function.
'this will not compile: myCarStoredInVehicle.DoCarStuff()
Dim myCar As Car = New Car()
myCar.DoVehicleStuff() 'I can still call this function.
myCar.DoCarStuff() 'and I can do the DoCarStuff() function, because the variable is a Car.
所以回答你的问题:doStuff()是所有车辆需要的东西,还是汽车?如果它是所有车辆需要以某种方式进行的事情,那么您需要编写一个可覆盖(或抽象)的功能。如果它只是汽车使用的东西,那么你就不能使用Vehicle类实例来获得你想要的东西。您需要以下选项之一: