2011-10-20 10 views
1

親クラスが子クラスのオブジェクトをインスタンス化することができるかどうかは、無限回帰にはならないのですか?それは無限再帰に入っています、とすぐにAppleがインスタンス化されるようスタックオーバーフローのスタックオーバーフロー

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インスタンスが持っている型(例えばクラスAppleを)、それは持っていることは非常に奇妙です - フルーツのメンバーも。

のメンバの次元がFruitTypeFruitTypeというモデルにすると、無限再帰は起こりませんでした。

+1

非常に雄弁で分かりやすい。私はこれを説明するためにクラスを更新します。もちろん、私はあなたがこれをやっているならば、あなたの実装を再考する必要があるかもしれないが、悪い設計の落とし穴の素晴らしい例は決して少なくないと主張するだろう。 – deanvmc

関連する問題