In diesem Tutorial möchte ich anhand einer Aufgabenstellung erklären, wie man Klassen und Klassenvererbung sinnvoll einsetzen kann.
Als Beispiel:
Das Ziel ist es eine Konsolenanwendung zu erstellen, die diverse benutzerdefinierte Befehle ausführen kann.
Die Syntax bei diesem Beispil ist:
/(Befehl)[~(Parameter)]
Also könnte ein Befehl zum Beispiel so aussehen: "/Start~C:\Users\Administrator\Desktop\Testanwendung1.exe"
Es ist nun nicht sinnvoll die gesammte Auswahl der Befehle in eine Select Case - Verzweigung zu packen. Schonmal wegen der Übersichtlichkeit und der eingeschränkten Möglichkeit weitere Befehle hinzuzufügen.
Die Auslagerung in eine Klasse kommt hier sehr praktisch.
Dazu möchte ich zuerst erklären, was das Schlüsselwort "Inherits" bedeutet.
Das bekannteste Beispiel ist der Typ Object. Alle .Net Typen sind Object untergeordnet, was wiederum heißt, dass sie von Object erben.
Um es an einem Beispiel zu zeigen:
Natürlich ist das Array vom Typ String() und damit "As Object" sehr unsauber.
Um noch einen Schritt weiter zu gehen: Das hier verwendete Array enthält unterschiedliche Typen. Hier wäre ein "As String" nicht mehr möglich, weil das mit den Typen Integer und StreamReader nicht mehr zusammenpasst. Auch "As Integer" ist nicht möglich, weil das mit den jeweils anderen Typen nicht übereinstimmt.
Natürlich wird jeder Option Strict On Programmierer sofort sagen, dass das ein völliger Blödsinn ist.
Aber wenn es darum geht eine Auflistung von mehreren verschiedenen Objekten zu erstellen um etwas abzufragen, was alle gemeinsam haben wird Klassenvererbung interessant.
Um ein Grundgerüst zu erhalten erstellen wir eine neue Konsolenanwendung und fügen eine endlos-Schleife ein:
Damit das Hauptprogramm schön übersichtlich bleibt fügen wir dem Projekt eine neue Klasse hinzu und nennen diese z.B. "Commands".
In dieser Klasse werden alle Befehle untergebracht, über die das Programm verfügen soll.
Um die Klassenvererbung erst möglich zu machen fügen wir dieser Klasse die Basisklasse aller Befehle hinzu. Dabei darf das Schlüsselwort "MustInherit" nicht vergessen werden, weil es angibt, dass die Klasse nicht "alleine" verwendet werden kann. Also wird "Dim Test As CommandBaseClass" nicht funktionieren (kann es ja auch nicht, denn die Basisklasse alleine ist nutzlos).
Diese Klasse nennen wir "CommandBaseClass"
Das alleine reicht noch nicht. Jetzt müssen wir überlegen, welche gemeinsamen Eigenschaften, Prozeduren, etc. alle Befehle haben sollen.
In diesem Beispiel erhalten alle Befehle eine Variable "InitializeString As String", die angibt, wie der Befehl aussehen soll (z.B. "/Start"), eine Variable "Description As String", die Informationen über den Befehl angibt (z.B. "Startet eine Anwendung oder öffnet eine Datei mit dem angegebenen Pfad").
Die einzige Prozedur, über die Befehle verfügen ist die "Start" Prozedur, in der der Code des Befehls abgearbeitet wird. Ihr wird auch der angegebene Parameter übergeben.
Damit ist die Basisklasse fertig.
Jetzt können alle Befehle als Klassen hinzugefügt werden.
Um es am Befehl "Start" zu zeigen:
Normalerweise wird automatisch die Sub "Public Overrides Sub Start(ByVal Parameter As String)" hinzugefügt. Falls dies nicht der Fall ist muss das nachgeholt werden.
Um den Befehl "Start" nun verwendbar zu machen müssen den beiden vorher deklarierten Variablen "InitializeString" und "Description" in der Sub "New" die entsprechenden Werte hinzugefügt werden.
Und um Platz zu sparen alles auf einmal: In der Sub "Start" wird der Code eingefügt, der für diesen Befehl verwendet werden soll. In diesem Fall fünf Zeilen.
Die fertige Klasse für den Start Befehl:
Als nächstes wird der Klasse "Commands" eine Funktion hinzugefügt, die es erleichtert alle Befehle aufzulisten.
Damit wäre die Klasse "Commands" abgeschlossen (natürlich können weitere Befehle hinzugefügt werden).
Das eigentliche Programm ist jetzt ein Kinderspiel.
Es muss nur ein paar Dinge machen:
Auflistung aller Befehle, Eingabe des Benutzers aufnehmen, anhand des Anfangs herausfinden, welcher Befehl ausgeführt werden soll, die Sub "Start" des Befehls starten und falls vorhanden den Parameter übergeben.
Mein Beispiel sieht so aus:
Dieses Beispiel kann sicherlich noch optimiert werden, aber es geht im Wesentlichen darum zu zeigen, wofür die Klassenvererbung verwendet werden kann.
Damit wäre dieses Tutorial fertig.
Auf Verbesserungsvorschläge, etc. würde ich mich freuen.
Im Anhang befindet sich noch das Projekt, in dem ein paar Befehle hinzugefügt wurden.
Als Beispiel:
Das Ziel ist es eine Konsolenanwendung zu erstellen, die diverse benutzerdefinierte Befehle ausführen kann.
Die Syntax bei diesem Beispil ist:
/(Befehl)[~(Parameter)]
Also könnte ein Befehl zum Beispiel so aussehen: "/Start~C:\Users\Administrator\Desktop\Testanwendung1.exe"
Es ist nun nicht sinnvoll die gesammte Auswahl der Befehle in eine Select Case - Verzweigung zu packen. Schonmal wegen der Übersichtlichkeit und der eingeschränkten Möglichkeit weitere Befehle hinzuzufügen.
Die Auslagerung in eine Klasse kommt hier sehr praktisch.
Dazu möchte ich zuerst erklären, was das Schlüsselwort "Inherits" bedeutet.
Das bekannteste Beispiel ist der Typ Object. Alle .Net Typen sind Object untergeordnet, was wiederum heißt, dass sie von Object erben.
Um es an einem Beispiel zu zeigen:
Natürlich ist das Array vom Typ String() und damit "As Object" sehr unsauber.
Um noch einen Schritt weiter zu gehen: Das hier verwendete Array enthält unterschiedliche Typen. Hier wäre ein "As String" nicht mehr möglich, weil das mit den Typen Integer und StreamReader nicht mehr zusammenpasst. Auch "As Integer" ist nicht möglich, weil das mit den jeweils anderen Typen nicht übereinstimmt.
Natürlich wird jeder Option Strict On Programmierer sofort sagen, dass das ein völliger Blödsinn ist.
Aber wenn es darum geht eine Auflistung von mehreren verschiedenen Objekten zu erstellen um etwas abzufragen, was alle gemeinsam haben wird Klassenvererbung interessant.
Um ein Grundgerüst zu erhalten erstellen wir eine neue Konsolenanwendung und fügen eine endlos-Schleife ein:
Damit das Hauptprogramm schön übersichtlich bleibt fügen wir dem Projekt eine neue Klasse hinzu und nennen diese z.B. "Commands".
In dieser Klasse werden alle Befehle untergebracht, über die das Programm verfügen soll.
Um die Klassenvererbung erst möglich zu machen fügen wir dieser Klasse die Basisklasse aller Befehle hinzu. Dabei darf das Schlüsselwort "MustInherit" nicht vergessen werden, weil es angibt, dass die Klasse nicht "alleine" verwendet werden kann. Also wird "Dim Test As CommandBaseClass" nicht funktionieren (kann es ja auch nicht, denn die Basisklasse alleine ist nutzlos).
Diese Klasse nennen wir "CommandBaseClass"
Das alleine reicht noch nicht. Jetzt müssen wir überlegen, welche gemeinsamen Eigenschaften, Prozeduren, etc. alle Befehle haben sollen.
In diesem Beispiel erhalten alle Befehle eine Variable "InitializeString As String", die angibt, wie der Befehl aussehen soll (z.B. "/Start"), eine Variable "Description As String", die Informationen über den Befehl angibt (z.B. "Startet eine Anwendung oder öffnet eine Datei mit dem angegebenen Pfad").
Die einzige Prozedur, über die Befehle verfügen ist die "Start" Prozedur, in der der Code des Befehls abgearbeitet wird. Ihr wird auch der angegebene Parameter übergeben.
Damit ist die Basisklasse fertig.
Jetzt können alle Befehle als Klassen hinzugefügt werden.
Um es am Befehl "Start" zu zeigen:
Normalerweise wird automatisch die Sub "Public Overrides Sub Start(ByVal Parameter As String)" hinzugefügt. Falls dies nicht der Fall ist muss das nachgeholt werden.
Um den Befehl "Start" nun verwendbar zu machen müssen den beiden vorher deklarierten Variablen "InitializeString" und "Description" in der Sub "New" die entsprechenden Werte hinzugefügt werden.
Und um Platz zu sparen alles auf einmal: In der Sub "Start" wird der Code eingefügt, der für diesen Befehl verwendet werden soll. In diesem Fall fünf Zeilen.
Die fertige Klasse für den Start Befehl:
VB.NET-Quellcode
- Public Class Command_Start
- Inherits CommandBaseClass
- Public Sub New()
- InitializeString = "/Start"
- Description = "Startet eine Anwendung oder öffnet eine Datei mit dem übergebenen Pfad"
- End Sub
- Public Overrides Sub Start(ByVal Parameter As String)
- If Parameter = "" Then
- Console.WriteLine("Es wurde kein Parameter angegeben")
- Else
- Process.Start(Parameter)
- End If
- End Sub
- End Class
Als nächstes wird der Klasse "Commands" eine Funktion hinzugefügt, die es erleichtert alle Befehle aufzulisten.
Damit wäre die Klasse "Commands" abgeschlossen (natürlich können weitere Befehle hinzugefügt werden).
Das eigentliche Programm ist jetzt ein Kinderspiel.
Es muss nur ein paar Dinge machen:
Auflistung aller Befehle, Eingabe des Benutzers aufnehmen, anhand des Anfangs herausfinden, welcher Befehl ausgeführt werden soll, die Sub "Start" des Befehls starten und falls vorhanden den Parameter übergeben.
Mein Beispiel sieht so aus:
VB.NET-Quellcode
- Sub Main()
- 'Ausgabe aller Befehle
- Console.WriteLine("Die verfügbaren Befehle sind:")
- For Each i As Commands.CommandBaseClass In Commands.GetAllCommands
- Console.WriteLine(i.InitializeString)
- Next
- Do
- 'Aufnahme der Eingabe
- Console.WriteLine("Bitte geben Sie einen Befehl ein")
- Dim LastLine As String = Console.ReadLine
- Dim Done As Boolean = False
- 'Den entsprechenden Befehl starten
- For Each i As Commands.CommandBaseClass In Commands.GetAllCommands
- If i.InitializeString = LastLine.Split("~"c).First Then
- 'Wenn ein Parameter eingegeben wurde wird dieser der Sub Start übergeben, falls nicht wird "" übergeben
- i.Start(If(LastLine.Contains("~"), LastLine.Substring(LastLine.IndexOf("~"c)), ""))
- Done = True
- End If
- Next
- 'Wenn ein passender Befehl gefunden wurde wird "Vorgang abgeschlossen" ausgegeben, falls nicht bedeutet das, dass der Benutzer eine ungültige Eingabe gemacht hat.
- If Done Then
- Console.WriteLine("Vorgang abgeschlossen")
- Else
- Console.WriteLine("Ungülgige Eingabe")
- End If
- Loop
- End Sub
Dieses Beispiel kann sicherlich noch optimiert werden, aber es geht im Wesentlichen darum zu zeigen, wofür die Klassenvererbung verwendet werden kann.
Damit wäre dieses Tutorial fertig.
Auf Verbesserungsvorschläge, etc. würde ich mich freuen.
Im Anhang befindet sich noch das Projekt, in dem ein paar Befehle hinzugefügt wurden.
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils