2011-10-20 5 views
1

Je me demandais si la classe parent pouvait instancier un objet d'une classe enfant sans entrer dans une récursion infinie.Dépassement de pile pour débordement de pile

Considérons cet exemple:

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 

Dès qu'un Apple instancié, il est entrer dans la récursion infinie.

Est-il incorrect de dire que c'est impossible, c'est d'avoir un enfant référencé dans le parent qui est aussi la base?

EDIT: De la réponse ci-dessous j'ai mis à jour le code, et voilà, cela fonctionne.

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 

Répondre

1

Ceci pourrait être appelé "type infini". Cela ne doit pas poser de problème si vous autorisez la variable membre à rester vide.

Sans regarder la signification réelle de ce code, vous pouvez dire ceci:

Dicter que le membre FruitType doit être un dans une quantité infinie de résultats exemple Apple d'objets de nidification. Le laisser non initialisé (Dim FruitType as Fruit) ne poserait aucun problème.

Maintenant, quand vous faites prendre la sémantique en compte:

Vous mixez le concept "Type" avec le concept d ' "instance": une instance Fruit a-type (par exemple, la classeApple), mais il est assez étrange de le laisser - un membre de Fruit, aussi.

Si vous auriez modélisé cela comme une classe FruitType, où Fruit a un membre coté FruitType, la récursion infinie ne se serait pas produite.

+1

Très éloquent et facile à comprendre. Je vais mettre à jour la classe pour tenir compte de cela. Bien sûr, je dirais que si vous faites cela, vous devrez peut-être repenser votre mise en œuvre, mais jamais un meilleur exemple des pièges de la mauvaise conception. – deanvmc