2010-11-07 16 views
0

Je construis une collection d'objets, et j'ai besoin d'utiliser l'héritage sur une classe de base - j'ai essayé pendant des heures de diverses façons et je ne peux pas obtenir ceci pour fonctionner n'importe quoi - l'erreur est toujours "Référence d'objet non définie à une instance d'un objet.".NET Héritage avec collections «Référence de l'objet non défini ...» Erreurs

L'idée dans l'exemple ci-dessous est qu'un objet est instancié et dans lequel se trouve une collection d'Etudiants lorsque j'essaie d'accéder à la propriété oDemo.Students(0).Name l'erreur est générée. Sinon, l'objet semble avoir été instancié.

Voici le code utilisé pour instancier et accéder à la classe (à partir de ASP.NET).

Dim oDemo As New MyDemo.Students 
lblTest.Text = oDemo.Student(0).Name 

Voici l'exemple de code de la bibliothèque de classes:

Public Class Students 
    Private p_Students As System.Collections.Generic.List(Of Test) 
    ReadOnly Property Student() As System.Collections.Generic.List(Of Test) 
     Get 
      Dim alTestNames As New ArrayList() 
      alTestNames.Add("John") 
      alTestNames.Add("Brian") 
      alTestNames.Add("Scott") 
      For iLoop As Integer = 0 To alTestNames.Count - 1 
       p_Students.Add(New Test(alTestNames(iLoop).ToString)) 
      Next 
      Return p_Students 
     End Get 
    End Property 
End Class 

Public MustInherit Class TestBase 
    Private p_Name As String 
    ReadOnly Property Name() As String 
     Get 
      Return p_Name 
     End Get 
    End Property 
    Sub New(ByRef sName As String) 
     p_Name = sName 
    End Sub 
End Class 

Public Class Test 
    Inherits TestBase 
    Sub New(ByRef sName As String) 
     MyBase.New(sName) 
    End Sub 
End Class 

Je ne sais pas si je suis tout à fait le point manque d'une certaine manière - toute aide est reçue avec reconnaissance. Si vous avez besoin de plus d'informations/d'informations, veuillez nous en informer.

Répondre

3

Vous n'avez jamais initialisé le champ p_Students, c'est Nothing et provoque l'exception. Correction:

Private p_Students As New System.Collections.Generic.List(Of Test) 

Notez le nouveau mot-clé. C'est la solution rapide, une approche plus saine serait:

Public Class Students 
    Private p_Students As System.Collections.Generic.List(Of Test) 
    Public Sub New() 
     p_Students = New System.Collections.Generic.List(Of Test) 
     p_Students.Add(New Test("John")) 
     '' etc.. 
    End Sub 
    ReadOnly Property Student() As System.Collections.Generic.IList(Of Test) 
     Get 
      Return p_Students 
     End Get 
    End Property 
End Class 
+0

Merci - cela a résolu le problème - le code d'exemple était une aide massive. – Chris

1

Vous recevez le message d'erreur car vous n'initialisez jamais p_Students dans la classe Students. Vous continuez également à ajouter de nouveau les mêmes noms au tableau p_Students chaque fois que vous accédez à la propriété Student(). Vous pouvez vouloir initialiser le tableau et ajouter les noms de test une seule fois dans un constructeur.

+0

Je viens de corriger le problème avec l'arraylist toujours coller la première entrée - mais cela ne fait aucune chance. Pourriez-vous préciser ce que vous voulez dire à propos de l'initialisation de p_students? Merci de votre aide. – Chris

+0

Le code de Hans Passant ci-dessus développe bien ce que je voulais dire. – TroutKing