2017-07-07 49 views
2

当我创建我的Vehicle类的实例时,出现System.StackOverflowException。我相信这是因为我有一个对象引用了我的Car类,该类继承自Vehicle,并且它陷入了一个无限循环。System.StackOverflowException当创建类的实例

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的一些方法和属性。使用virtual不是我正在寻找的,因为我不需要重写任何方法。

+0

汽车不应该实例化汽车类,它应该是相反的方式 – soohoonigan

+1

不知道“doStuff()”做了什么,很难说,但“我需要能够访问'doStuff()'从另一个文件不需要创建一个'Car'的实例,通常可以通过将其设置为Shared来解决 - 即'Public Shared Sub doStuff()'。然后你可以直接从'Foo'中的方法调用它:'Car.doStuff()'。 – Mark

+5

你不只是'有一个对象参考车类'车**创建**一个**新**车实例和车继承车辆,因此无尽循环:车辆 - >车 - >车... – Plutonix

回答

4

好吧,我认为这可能是你想要派生类的误解。让我用你的两个类举个例子:

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 

好吧,车辆有两个功能 - 其中之一是“重写”,这意味着它的存在,但派生类可以覆盖它。然后,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()的东西吗?如果所有车辆都需要以某种方式进行操作,则需要编写一个可覆盖的(或抽象的)功能。如果它只是Cars使用的东西,那么你不能为你想要的东西使用Vehicle类实例。您需要以下选项之一:

  1. 将您的变量声明为汽车。
  2. 将您的变量声明为Vehicle,但将其实例化为新的 Car()。然后当您需要使用DoStuff()时,将该变量作为(Car)投射。

编辑:哎呀,OP是询问VB,而不是C#。适当编辑代码。

+0

问题是在VB中,这个答案是在C#中... –

+1

@Lews - 谢谢!我甚至没有注意到这一点。我编辑了我的答案,将其更改为vb.net – Kevin