2011-10-20 238 views
1

我想知道如果我可以讓父類實例化一個子類的對象,而無需進入無限遞歸。只要蘋果被實例化堆棧溢出堆棧溢出

Module Module1 
    Sub Main() 
     Dim _baseFruit As New Fruit 
     _baseFruit.Write() 

     Console.ReadKey() 
    End Sub 
End Module 

Public Class Fruit 
    Public Property Type As String 
    Public Property BaseType As String 
    Public Property FruitType As New Apple 

    Sub New() 
     Type = "Fruit" 
     BaseType = "N/A" 
    End Sub 

    Public Sub Write() 
     Console.WriteLine("Type: {0} BaseType: {1} FruitType: {2} ", Type, BaseType, FruitType.Type) 
    End Sub 
End Class 

Public Class Apple 
    Inherits Fruit 

    Public Sub New() 
     Me.Type = "Apple" 
    End Sub 
End Class 

,它進入無限遞歸:

考慮這個例子。

說這是不可能的,這是不正確的,那就是有一個孩子在父母也是基地引用?

編輯:從下面的答案我已經更新了代碼,你看,它的工作原理。

Module Module1 
    Sub Main() 
     Dim _baseFruit As New Fruit 
     Dim _apple As New Apple 

     _baseFruit.Write(_apple) 
     Console.ReadKey() 
    End Sub 
End Module 

Public Class Fruit 
    Public Property Type As String 
    Public Property BaseType As String 
    Public Property FruitChildInstance As Apple 

    Sub New() 
     Type = "Fruit" 
     BaseType = "N/A" 
    End Sub 

    Public Sub Write(ByVal fruit As Apple) 
     FruitChildInstance = fruit 
     Console.WriteLine("Type: {0} BaseType: {1} FruitType: {2} ", Type, BaseType, FruitChildInstance.Type) 
    End Sub 
End Class 

Public Class Apple 
    Inherits Fruit 

    Public Sub New() 
     Me.Type = "Apple" 
    End Sub 
End Class 

回答

1

這可以稱爲「無限類型」。如果允許將成員變量保留爲空,它不一定是個問題。

沒有看這段代碼的實際意義,你可以這樣說:

口述了FruitType成員必須是在嵌套對象的無限量的Apple實例結果。將其保持未初始化狀態(Dim FruitType as Fruit)完全不會造成任何問題。

現在,當你做採取語義考慮:

你混「類型」的概念與「實例」的概念:一個Fruit實例有-A型(如Apple ),但讓它擁有一個水果成員也是很奇怪的。

如果您將此建模爲FruitType類,其中Fruit的成員尺寸爲FruitType,則無限遞歸不會發生。

+1

非常有說服力,容易理解。我會更新課程來解釋這一點。當然我會爭辯說,如果你這樣做,你可能需要重新思考你的實現,但從來不是一個糟糕的設計陷阱的好例子。 – deanvmc