Klassen, Unterklassen Vererbung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 120 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Klassen, Unterklassen Vererbung

    Hallo zusammen

    Ich plane gerade ein neues Projekt und habe nun erstmal ohne großartig zu Coden einige Fragen zu Klassen.

    Auf dem Papier habe ich
    Eine Hauptklasse und bis jetzt 3 weitere Klassen und das Form.

    Kann mir einer in einfachen Worten / Beispielen erklären wie das mit der Vererbung geht und vorallem mit dem:

    VB.NET-Quellcode

    1. Public Sub New()
    2. ...
    3. End Sub


    DANKE ^^
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Sub New nennt sich Konstruktor. Das ist eine Methode, die aufgerufen wird, wenn man schreibt: New DeineKlasse.
    Also

    VB.NET-Quellcode

    1. Friend Class Fahrrad
    2. Friend Sub New()
    3. MessageBox.Show("Die Methode New (alias Konstruktor) wurde aufgerufen.")
    4. End Sub
    5. End Class
    6. 'und in einer anderen Klasse:
    7. Dim MeinErstesFahrrad As New Fahrrad 'hier wird die o.g. Methode aufgerufen und somit die MessageBox gezeigt.

    Nachdem die Klasseninstanz erstellt wurde, wird der Konstruktor nie wieder aufgerufen. Daher wird der Konstruktor v.a. verwendet, um z.B. Startwerte festzulegen. Auch ReadOnly-Variablen dürfen hier einen Wert bekommen.
    Nicht jede Klasse braucht eine derartige, eigene Initialisierung. Daher muss man eigene Konstruktoren nur erstellen, wenn man dafür eine Verwendung hat.

    Man kann auch weitere eigene Konstruktoren schreiben, die dann verschiedene Parameter hat, also z.B. Friend Sub New(Farbe As Drawing.Color) oder Friend Sub New(AnzahlDerRäder As Integer). Wenn Du aber nur einen eigenen Konstruktor mit mindestens einem Parameter hast, kannst Du nicht mehr Dim MeinErstesFahrrad As New Fahrrad schreiben, dann brauchst Du immer die Parameter.

    Vererbung ist, wenn Du eine Klassenspezialisierung brauchst/willst. Wenn Du also eine allgemeine Klasse hast und davon Sondertypen brauchst. Das ist dann später in Deinem Ampelprojekt z.B. Ampel als Basisklasse und Fußgängerampel, Links-/Rechtabbiegerampel, Fahrzeugampel, Fahrradfahrerampel jeweils als Spezialisierung der "normalen"/allgemeinen Ampel.
    Läuft über Friend Class Fußgängerampel: Inherits Ampel. Weitere Ausführungen gibt's irgendwo im Grundlagenforum.

    [HOW TO] Eigene Klassen erstellen, verwalten und verwenden
    Objektorientierte Programmierung (OOP)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @Amelie Vererbung findet statt, wenn Du Basisklassen erstellst, die für verschiedene abgeleitete Klassen "Basis-Funktionalität" bereitstellen.

    VB.NET-Quellcode

    1. Friend Class Fahrzeug
    2. Public Property AnzahlRäder As Integer
    3. ' ...
    4. End Class
    Davon könnte man ableiten:

    VB.NET-Quellcode

    1. Friend Class Fahrrad
    2. Inherits Fahrzeug
    3. ' ...
    4. End Class
    und da drin die Spezialisierung von Fahrzeug zu Fahrrad reinpacken.
    Das nächste wäre dann z.B.

    VB.NET-Quellcode

    1. Friend Class Auto
    2. Inherits Fahrzeug
    3. ' ...
    4. End Class
    Und wenn wir das weiter spinnen, könnt dann so was raus:

    VB.NET-Quellcode

    1. Friend Class Benz
    2. Inherits Auto
    3. ' ...
    4. End Class
    Die Konstruktoren der Basisklasse kann man nur dann explizit aufrufen:

    VB.NET-Quellcode

    1. Friend Class Fahrrad
    2. Inherits Fahrzeug
    3. Friend Sub New()
    4. MyBase.New() ' den Konstruktor der Basisklasse aufrufen
    5. MessageBox.Show("Die Methode New der Klasse Fahrrad wurde aufgerufen.")
    6. End Sub
    7. End Class

    VB.NET-Quellcode

    1. Friend Class Fahrzeug
    2. Public Property AnzahlRäder As Integer
    3. Friend Sub New()
    4. MessageBox.Show("Die Methode New der Klasse Fahrzeug wurde aufgerufen.")
    5. End Sub
    6. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Moin moin

    Ich nehme das von Euch beiden mal und kritzel weiter auf dem Papier.
    Melde mich später wieder, mit ersten ergüssen meiner Gedanken.

    Jetzt :evil: Zahnarztermin :S
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nabend...

    MyBase.New() ' den Konstruktor der Basisklasse aufrufen
    Da muss doch etwas aus der "Superklasse" eingetragen werden oder?

    Weitere Frage: Aus der Superklasse auf die Subklasse zugreifen / Subs aufrufen..???

    VB.NET-Quellcode

    1. Friend Class Fahrzeug
    2. Public Property irgendwas As Integer
    3. Friend Sub blabla()
    4. Fahrrad.MACHEDAS() 'Das funktioniert so nicht?
    5. End Sub
    6. End Class


    VB.NET-Quellcode

    1. Friend Class Fahrrad
    2. Inherits Fahrzeug
    3. Friend Sub MACHEDAS()
    4. 'Tue etwas wichtiges
    5. End Sub
    6. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    VB.NET-Quellcode

    1. Fahrrad.MACHEDAS() 'Das funktioniert so nicht?
    Einfach nur MACHEDAS().
    Wenn Du willst, dass auf die Prozedur MACHEDAS() nur innerhalb der Fahrzeug-Klassen zugegriffen werden kann, mach sie nicht Friend, sondern Protected.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Noch nicht ganz verstanden.

    Ich möchte aus der SuperClass eine Methode in der SubClass aufrufen.
    Hatte beide schon auf Public aber das funzt nicht..
    Muss ich das mit dem Sub New() arbeiten?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Ich möchte aus der SuperClass eine Methode in der SubClass aufrufen.
    Dann rufe sie einfach auf.
    Da die Klassen voneinander abgeleitet sind, geht das einfach so.
    Wenn Du in mehreren Ebenen Prozeduren mit gleichem Namen hast, musst Du die entsprechend deklarieren.
    Schau mal hier rein: docs.microsoft.com/de-de/dotne…lasses/inheritance-basics
    ====
    Sorry, Du mainst das anders herum.

    VB.NET-Quellcode

    1. Friend MustInherit Class Fahrzeug
    2. Public Property irgendwas As Integer
    3. Friend Sub blabla()
    4. MACHEDAS() 'Das funktioniert so nicht?
    5. End Sub
    6. Protected MustOverride Sub MACHEDAS()
    7. End Class
    8. Friend Class Fahrrad
    9. Inherits Fahrzeug
    10. Protected Overrides Sub MACHEDAS() ' Kundtun, dass eine gleichnamige Prozedur in einer abgeleiteten Klasse aufgerufen werden soll
    11. 'Tue etwas wichtiges
    12. End Sub
    13. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()

    Ja von dem Protected Overwrite lass ich schon... Hatte es aber nicht verstanden.
    Werde mal mit deinem Beispeil etwas "spielen" ;) Danke

    Noch eine Farge zu einem anderen Klassen Fall:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class RAD
    2. Dim Durchmesser As Double
    3. End Class
    4. Public Class Reifen
    5. Inherits RAD
    6. Dim Durchmesser As Double
    7. Dim Typ() As String = {"Sommer", "Winter", "Alwetter"}
    8. End Class
    9. Public Class Felge
    10. Inherits RAD
    11. Dim Durchmesser As Double
    12. Dim Typ() As String = {"Stahl", "Alu"}
    13. End Class


    Oder So???

    VB.NET-Quellcode

    1. Public Class RAD
    2. Dim Durchmesser As Double
    3. 'tue etwas
    4. Public Class ReifenFelge
    5. Inherits RAD
    6. Dim ReifenDurchmesser As Double
    7. Dim ReifenTyp() As String = {"Sommer", "Winter", "Alwetter"}
    8. Dim FelgenDurchmesser As Double
    9. Dim FelgenTyp() As String = {"Stahl", "Alu"}
    10. 'tue etwas
    11. End Class
    12. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Das hängt davon ab, wieviele Unterschiede und Gemeinsamkeiten es gibt.
    Außerdem davon, wie viele Properties und Prozeduren da vorkommen.
    Du kannst auch nur eine Klasse machen, in der alle Properties gehalten werden.
    Dein zweiter Code geht designmäßig für meinen Geschmack etwas daneben, da Du eine innere Klasse von der äußeren Klasse ableitest.
    Dann eher so:

    VB.NET-Quellcode

    1. Public Class RAD
    2. Dim Raddurchmesser As Double
    3. Dim ReifenDurchmesser As Double
    4. Dim ReifenTyp() As String = {"Sommer", "Winter", "Alwetter"}
    5. Dim FelgenDurchmesser As Double
    6. Dim FelgenTyp() As String = {"Stahl", "Alu"}
    7. 'tue etwas
    8. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bitte mit der Fachbegriffsbezeichnung aufpassen: SuperClass und SubClass sind hier fehl am Platz. Es gibt ne Basisklasse und ne abgeleitete/erbende Klasse.
    Und: MustInherit bedeutet zwangsläufig, dass die so gekennzeichnete Klasse selber nicht instanziiert werden kann.
    @Amelie: Das Rad-Reifen-Felge-Beispiel geht in die falsche Richtung. Vererbung kann man grundsätzlich mit Ist-ein-spezielles ausdrücken. Aber die Aussage Reifen ist ein spezielles Rad oder Felge ist ein spezielles Rad ist einfach falsch. Rad hat Reifen und Felge. Das ist dann aber nicht Vererbung, sondern Komposition. Reifen und Felge sind also Teil des Rades:

    VB.NET-Quellcode

    1. Friend Class Rad
    2. Property Stahlfelge As Felge
    3. Property Sommerreifen As Reifen
    4. End Class
    5. Friend Class Felge
    6. End Class
    7. Friend Class Reifen
    8. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Moin moin

    Das mit den Begriffen "Superclass" etc haben so einige in Ihren Tutorials so genannt.
    @VaporiZed
    Ja so macht das Sinn mit Rad und Reifen :) Mal sehen wie ich das in meinem Project umsetzen kann.

    ​Protected MustOverride Sub Kämpf noch damit ein bissel weil es nicht so klappt wie ich möchte.
    Es muss nicht zwangsläufig Protected sein??
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Es muss nicht zwangsläufig Protected sein?????????
    Ein Fragezeichen reicht. ;)
    Wie gesagt: Protected bedeutet, dass das Objekt nur in den Klassen gesehen wird, die der "Erben-Gemeinschaft" angehören.
    Selbstverständlich kannst Du die auch Friend oder Public deklarieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    OK Das habe ich verstanden. Hab nun einiges mit Klassen ausprobiert.
    Mir fällt es echt schwer zu sagen, was in eine Klasse kommt und was in eine andere.
    Beispiel mit dem Rad. Was @VaporiZed schrieb macht schon Sinn ... ;( kopfraucht ...

    Andeses Beispiel: Ein Haus

    Klasse Haus und Stockwerke und Treppen.... sind das dann 2 .. X Klassen oder nur eine?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    sind das dann 2 .. X Klassen oder nur eine?
    Das können ruhig x Klassen sein, nur sollen sie nicht voneinander abgeleitet sein, sondern z.B. von einer gemeinsamen Basisklasse.
    Die Klasse, die das übergeordnete Objekt beschreibt, hat dann Instanzen der Klassen der untergeordneten Objekte als Member.
    Haus hat Treppe
    Haus hat Fenster, Türen
    Haus hat Dach
    Dach hat Dachziegel
    ==>
    Haus hat Dach und Dach hat Dachziegel,
    nicht aber Haus hat Dachziegel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ​Die Klasse, die das übergeordnete Objekt beschreibt, hat dann Instanzen der Klassen der untergeordneten Objekte als Member. ;( ?( ?(
    OK Nochmal drüber nachdenken und ein Versuch zusammen stellen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie So was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class Haus
    2. Dim MyTreppe As New Treppe()
    3. Dim MyFenster As New Fenster()
    4. Dim MyTüren As New Türen()
    5. Dim MyDach As New Dach()
    6. End Class
    7. Class Treppe
    8. End Class
    9. Class Fenster
    10. End Class
    11. Class Türen
    12. End Class
    13. Class Dach
    14. Dim MyDachziegel As New Dachziegel
    15. End Class
    16. Class Dachziegel
    17. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Amelie schrieb:

    Mir fällt es echt schwer zu sagen, was in eine Klasse kommt und was in eine andere.
    Betrachte irgendein Objekt in Deiner Umgebung, z.B. einen Kugelschreiber. Der hat ne Mine. Die kannst Du rausnehmen. Daher kannst Du die Mine als eigenes Objekt und somit als eigene Klasse machen - wenn Du die brauchst. Wenn Du keine Verwendung für die Beschreibung einer Kulimine hast, dann brauchst Du auch die Klasse Kulimine nicht.
    Ein PC hat Mainboard, Grafikkarte, CPU, Netzteil, SSD, usw.
    Die kannst Du alle als Klassen anlegen - falls Du sie in Deinem Programm brauchst. Falls nicht, lass die Klassen weg.
    Ein normaler sog. Bleistift besteht aus einem Holzgriff und einer Graphitmine. Wenn Du willst, kannst Du das Graphit als eine Sammlung von Kohlenstoffatimen sehen. Wenn Du die in Deinem Programm brauchst, mach Dir eine Klasse (Kohlenstoff)Atom. Ist aber unwahrscheinlich, dass Du sie brauchst, daher lass sie weg.
    Drösel ein Objekt solange in Einzelkomponenten und damit in weitere Klassen auf, bis Du davor bist, dass weitere Zerlegung für Dich irrelevant ist. Dann stopp!
    So kannst Du m.E. immer vorgehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:


    Drösel ein Objekt solange in Einzelkomponenten und damit in weitere Klassen auf, bis Du davor bist, dass weitere Zerlegung für Dich irrelevant ist. Dann stopp! So kannst Du m.E. immer vorgehen.

    Dann hätte man aber sehr schnell sehr viele Klassen, was dann auch wieder unübersichtlich werden kann.

    Das hatte vor kurzem dazu geführt das ich in meinem Disassembler Projekt die Anzahl der Klassen wieder
    reduziert hatte. Bei einem kleineren Projekt bin ich dazu über gegangen mir grob mit UML die Klassen und
    ihrer Zusammenhänge zu zeichnen, wobei ich so zwei Klassen entdeckt hatte die weitgehend das gleich
    selbe machen. Wenn ich zu Ostern wie auf das andere Projekt umschwenke dann werde ich da auch
    verstärkt mit UML arbeiten um den Überblick zu behalten.

    Und an Amelie... weiter so. :thumbup:

    Es ist mir immer wieder eine Freude zu lesen mit wieviel Einsatz Du beim Programmieren bist. Manches Deiner
    Probleme liest sich wie meine eigenen vor 20 Jahren. :D
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love: