Frage zu Vererbung und Objektinstanzen

Sunray

Erfahrenes Mitglied
Sorry dass ich dafür n neues Thema öffne.

Ich habe eine Frage zu Vererbung und Objektinstanzen.

Ich bin gerade daran eine kleine Konsole für eine Anwendung zu programmieren und habe mir beim erstellen der Befehle gedacht: "Halt, wozu gibts denn Vererbung?"
Also Basisklasse "Command" erstellt:
Code:
Public MustInherit Class Command 'Befehle
    Public Name As String 'Name des Befehls
    Public intParameter As Integer 'Anzahl Parameter
    Public Beschreibung As String 'Beschreibung
    Public Console As ConsoleControl = MainWindow.Console  'ConsolenControl
    Public Parameter() As Parameter

    MustOverride Sub runCmd()
    [usw...]
End Class
Dann erstelle ich eine neue Klasse, die von "Command" erben soll:
Code:
Public Class CMDecho
    Inherits Command
    Sub New(ByVal PName As String)
        Parameter(0) = New Parameter("output", "")
        intParameter = 1
        Name = PName
        Beschreibung = "Gibt Parameter [" & Parameter(0).Name & "] in der Konsole aus"
    End Sub

    Overrides Sub runCmd() 'führt Befehl aus
        Console.AddLine(Parameter(0).Value)
    End Sub

End Class
Visual Studio .NET erklärt diesen Code für richtig. (was aber ja noch lange nicht heisst...)
Compilieren: keine Probleme
Ausführen: Ich erhalte eine Ausnahme, die berühmte NullReferenceException.

Das heisst doch, dass ich mit einem Objekt arbeiten will, das noch gar nicht instanziert wurde oder?

Müsste diese Ausnahme dann nicht immer erscheinen wenn man das macht:
Code:
Dim Test as String
Test = "Hello World"
Hier greift man ja auch auf ein Objekt zu, das noch nicht instanziert wurde.

Wie soll ich jetzt in der Basisklasse eine Datentyp "Parameter"-Array erstellen, wenn ich dann doch nicht darauf zugreifen kann, um sie in den vererbten Klassen als
Code:
Parameter(0) = new Parameter("name", "defaultwert")
zu definieren.

Danke für jede Antwort
 

Dario Linsky

Erfahrenes Mitglied
Hast Du das ganze mal gedebuggt und die Anweisung mit dem NullPointer isoliert? Dann musst Du nur noch nachvollziehen, warum die Variable Nothing ist.
Ich bin nicht ganz sicher, weil ich es nicht ausprobieren kann, aber ich denke, es liegt an den Variablenbezeichnern, die teilweise etwas unpassend gewählt sind. Console z.B. kann auch System.Console heissen.
Im Zweifelsfall entweder den Namespace mit angeben oder einfach die Referenz auf die eigene Klasse (Me) davorsetzen.

Bei Deinem Beispiel mit dem String ist das etwas anderes, weil die Anweisung
Code:
test = "Test"
die Stringvariable ja schon instanziert. Das gleiche wie mit
Code:
int i;
i = 10;
 

Sunray

Erfahrenes Mitglied
Natürlich ist diese Variable Nothing.
Code:
public Console as ConsoleController
Der Namespace Console wurde nicht importiert
Code:
me.Console = new ConosleController(usw.)
funktioniert auch nicht.
 
Zuletzt bearbeitet:

Alexander Schuc

crazy-weasel
Original geschrieben von Sunray
Natürlich ist diese Variable Nothing.
Code:
public Console as ConsoleController
Der Namespace Console wurde nicht importiert
Code:
me.Console = new Conosle(usw.)
funktioniert auch nicht.

Hallo.

Kenne mich zwar in der VB Syntax nicht so aus, aber mit scheint doch als wäre die Variable Console vom Typ ConsoleController, also müsste es

Code:
me.Console = new ConsoleController(usw.)

lauten.

Mfg,
Alex
 

Sunray

Erfahrenes Mitglied
hm....:rolleyes: :rolleyes:

Natürlich hast du recht....

Es lautet natürlich:
Code:
public Console = new ConsoleController