创建类的实例时出现System.StackOverflowException

时间:2017-07-07 17:00:55

标签: .net vb.net inheritance

当我创建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并不是我想要的,因为我不需要覆盖任何方法。

1 个答案:

答案 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类实例来获得你想要的东西。您需要以下选项之一:

  1. 将您的变量声明为Car。
  2. 将您的变量声明为Vehicle,但将其实例化为New 汽车()。然后在需要使用时将变量转换为(Car) DoStuff()。
  3. 编辑:哎呀,OP问的是VB,而不是C#。适当地编辑了代码。