Klassen, Unterklassen Vererbung

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

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

    Also nochmal... das macht mich grade ...grrr

    VB.NET-Quellcode

    1. Public Class Mensch
    2. Inherits Säugetier
    3. Friend Mensch As Säugetier
    4. End Class
    5. Public Class Mann
    6. Inherits Mensch
    7. Friend Mann As Mann
    8. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Langsam. Lass mal bitte die Instanziierungen (diese As New-Zeilen) weg. Die kommen später und haben in den Klassen erstmal überhaupt nix verloren. In den Klassen geschrieben, bedeutet das nämlich automatisch eine Hat-Beziehung. Und Mensch hat "kein" Mann oder Frau, Genauso hat Hund keinen Dackel. Also: Lösch die gezeigten Zeilen, in denen As New steht.

    Schau Dir nochmal Zeile#8 an. Das mag zwar erstmal prinzipell stimmen, aber damit sagst Du, dass ein Säugetiewr ein Haar hat. Das muss dann natürlich noch abgewandelt werden, aber ich will EdR nicht in seiner Erklärung vorgreifen. Behalt es aber erstmal im Hinterkopf.
    Das mit Rüde und Hündin ist wie bei Mann und Frau. Es sind also Spezialisierungen von …?
    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.
    Das mit den Säugetieren und Haaren hatte ich ja schon erwähnt aber OK mache ich das dann so.
    Bestimmt wieder falsch.

    VB.NET-Quellcode

    1. Public Class Wirbeltier
    2. '.....
    3. End Class
    4. Public Class Säugetier
    5. Inherits Wirbeltier
    6. Friend Lunge As Lunge
    7. End Class
    8. Public Class Mensch
    9. Inherits Säugetier
    10. Friend Haar As Haar
    11. End Class
    12. Public Class Frau
    13. Inherits Mensch
    14. Friend Gebärmutter As Gebärmutter
    15. End Class
    16. Public Class Mann
    17. Inherits Mensch
    18. End Class
    19. Public Class Hund
    20. Inherits Säugetier
    21. Friend Haar As Haar
    22. End Class


    EDIT: 12:42
    Tja Hund und Mensch ... Keine Ahnung wie man das so noch hier unterscheiden soll...
    Im Moment erscheint mir das alles soooooooooooooooo viel an Klassen....
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Wird aber besser. Guck deine Klasse Mann hat immer noch einen Member Mann. Also sich selbst ???
    Beim Hund und Mensch hast du es richtig.
    Aber irgendwie sieht die Klasse Hund jetzt genauso aus wie die Klasse Mensch, da sollte uns also noch ein Unterschied einfallen, damit die Nutzung beider Klassen gerechtfertigt ist, (doppelter Code und so..)

    Ansonsten ists halt noch nicht vollständig

    Gonger96 schrieb:

    Warum wird hier eigentlich dauernd Friend benutzt? Das ist für deine Anwendungen wirklich irrelevant
    Ich benutze in erster Linie für meine Klassendeklarationen Friend. Wie es andere machen, ist mir pupe. Bei meinen DLLs natürlich Public, aber meine Endprogramme sollen keine API zur Verfügung stellen, daher kein Public, sondern Friend. Ist das Deiner Meinung nach für Amlie in ihrer jetzigen Lernphase irrelevant oder siehst Du generell Friend als irrelevant?
    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.
    Na angenommen man könnte Mensch und Hund wirklich nicht weiter unterscheiden, dann wird halt eine Klasse davon gestrichen. Brauchst dann nicht.

    Man könnte aber

    VB.NET-Quellcode

    1. Public Class Hund
    2. Inherits Säugetier
    3. Friend EinHaar as Haar
    4. End Class
    5. Public Class Mensch
    6. Inherits Säugetier
    7. Friend EinHaar as Haar
    8. Friend EineSprache as Sprache
    9. End Class


    Oder wie ich es tuen würde wenn man es abstrakt versteht, aber da kommen mir wieder die Tierschützer in die Quere.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Hund
    2. Inherits Säugetier
    3. Friend EinHaar as Haar
    4. End Class
    5. Public Class Mensch
    6. Inherits Hund
    7. Friend EineSprache As Sprache
    8. End Class

    Wenn der Hund das Haar schon hat, geb ich das halt auch weiter


    Das sind immer so viele Klassen, nur meist nicht selbst geschrieben. Jedes Objekt hat irgendwo eine Klasse hinter sich stehen.

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

    Wenn hier gerade die Grundsätze der Vererbung besprochen werden, finde ich es eher verwirrend.
    In einer Anwendung (exe) benutze ich public. Friend ist eher sinnvoll bei Bibliotheken für etwaige Helferklassen oder Funktion die zwar in der Assembly genutzt werden, in der öffentlichen Schnittstelle aber nichts zu suchen haben.

    Ich würde es wirklich erstmal bei public, protected und private belassen. Außerdem ist der Name nicht so toll. Das C# internal macht genau das was es heißt: Die Funktion ist Assembly-intern. Friend verwechsel ich immer mit C++ friend, was wieder etwas vollkommen anderes ist.
    @Haudruferzappeltnoch
    Naja sogesehen passt das auch nicht. Hunde und andere Tiere / Säugetiere haben auch eine Sprache, eben nur eine die der Mensch dann so nicht versteht.
    Das erwähnte ich gestern schon. ;)
    Ich dachte erst an Arme aber das passt auch nicht oder aufrechter Gang... ;) Schwer etwas zu finden.

    @Gonger96
    Ich verstehe was du mir sagen möchtest. Danke. Da ich aber von C++ / C# nun mal NULL Ahnung habe, und ich in meinen kleinen Projekten mit Friend und Private gut zurechtkomme...
    Als ich angefangen habe, da habe ich alles auf Public gemacht, bis mich @VaporiZed darauf aufmerksam machte, das so etwas auch mal "gefährlich" sein kann usw...
    Derzeit komme ich mit den beiden anderen am besten klar. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Haudruferzappeltnoch schrieb:

    Mensch und Hund wirklich nicht weiter unterscheiden
    Als Unterscheidungsmerkmal hätte ich an "Sprache" gedacht (wobei ich mir unter "Sprache" etwas vorstellte, was aus Worten besteht).
    Natürlich kann man nachträglich alles mögliche noch hinzufügen: (Unterscheidungs-)Merkmale so gut wie vererbende und erbende Entitäten.
    Aber ich würde vorschlagen, bei den gegebenen Begriffen zu bleiben, und nicht zu versuchen, eine vollständige Kladistik zu erstellen.

    Ich bin mit was anderen nicht zufrieden:

    VB.NET-Quellcode

    1. Public Class Säugetier
    2. Inherits Wirbeltier
    3. Friend Lunge As Lunge
    4. End Class
    5. Public Class Mensch
    6. Inherits Säugetier
    7. Friend Haar As Haar
    8. End Class
    9. Public Class Hund
    10. Inherits Säugetier
    11. Friend Haar As Haar
    12. End Class
    unzufrieden in zweifacher Hinsicht:
    Erstens erben Hund und Mensch ihre Behaarung vom Säugetier.
    Zweitens hat ein Säugetier viele Haare.
    Es liegt also eine Hat-Beziehung vom BeziehungTyp3 vor. Das modelliert man durch eine Auflistung, zB so:

    VB.NET-Quellcode

    1. Public Class Mensch : Inherits Säugetier
    2. Friend Haare As List(Of Haar)
    3. End Class




    Ansonsten, für die Intention des Spiels: Vererbung und Komposition zu verstehen, ist es egal, ob Friend oder Public deklariert wird.
    Tatsächlich gibts noch ca 10 weitere Möglichkeiten, wie man deklarieren könnte, aber lassen wirs doch erstmal so wies ist - ist doch nicht falsch.



    Also die Aufgabe ist noch nicht erledigt.
    Und sie ist nur erledigt, wenn auch alle vorgegebenen Begriffe richtig eingeordnet sind.
    Also nur Teile des Listings zu posten reicht nicht, weil die Klassen beziehen sich aufeinander, und wenn was fehlt wird es quasi sinnlos (und zB der Compiler kompilierts nicht).
    Langsam. Ich komm eh schon jetzt ducheinander!

    Erstens erben Hund und Mensch ihre Behaarung vom Säugetier.
    Also doch wieder einzeln machen?
    Friend Haare As List(Of Haar) ist das nicht nur eine spezielle Art von: Friend Haar As Haar
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Erstens erben Hund und Mensch ihre Behaarung vom Säugetier.
    Also doch wieder einzeln machen?
    Keine Ahnung, was du meinst mit: "einzeln machen"?
    Aber so oder so: Ist doch sonnenklar, was für das Klassen-System daraus folgt, wenn gesagt wird: Hund und Mensch erben ihre Behaarung vom Säugetier.


    Amelie schrieb:


    Friend Haare As List(Of Haar) ist das nicht nur eine spezielle Art von: Friend Haar As Haar
    Tja, das ist ein Problem mit der Mehrdeutigkeit der natürlichen Sprache.
    Mit "Haar" meinte ich "einzelnes Haar", und nicht Haar im Sinne von "Kopfbehaarung beim Menschen".
    Und von den einzelnen Haaren hat ein Säugetier numa viele.
    Also mit den Haaren weis ich jetzt echt nicht. Bei Hunden Katzen etc könnte man ja auch "Fell as Listof..." machen .. Keine Ahnung. ;(

    VB.NET-Quellcode

    1. Namespace Kladistik
    2. #If False Then
    3. Mensch, Hund, Wirbeltier, Säugetier, Mann, Frau, Fisch
    4. Haar, Sprache, Schwanzflosse, Flosse, Gebärmutter, Lunge, Ausweis
    5. #End If
    6. Public Class Wirbeltier
    7. End Class ' Wirbeltier
    8. Public Class Säugetier
    9. Inherits Wirbeltier
    10. Friend Lunge As Lunge
    11. Friend Haare As List(Of Haar)
    12. End Class ' Säugetier
    13. Public Class Fisch
    14. Inherits Wirbeltier
    15. Friend Schwanzflosse As Schwanzflosse
    16. Friend Flossen As List(Of Flosse)
    17. End Class ' Fisch
    18. Public Class Hund
    19. Inherits Säugetier
    20. End Class ' Hund
    21. Public Class Mensch
    22. Inherits Säugetier
    23. Friend Sprache As Sprache
    24. Friend Ausweis As Ausweis
    25. End Class ' Mensch
    26. Public Class Mann
    27. Inherits Mensch
    28. End Class ' Mann
    29. Public Class Frau
    30. Inherits Mensch
    31. Friend Gebärmutter As Gebärmutter
    32. End Class ' Frau
    33. Public Class Lunge
    34. End Class
    35. Public Class Flosse
    36. End Class
    37. Public Class Schwanzflosse
    38. End Class
    39. Public Class Haar
    40. End Class
    41. Public Class Sprache
    42. End Class
    43. Public Class Gebärmutter
    44. End Class
    45. Public Class Ausweis
    46. End Class
    47. End Namespace ' Kladistik


    EDIT 22:56
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Fell = Ansammlung von Haaren -> ein Fell ist per Definition = viele Haare, von daher braucht ein (Fell)Tier nur ein Fell.
    Haar = (normalerweise) ein einzelnes Haar; ein Mensch hat nach der Definition viele Haare, von daher braucht die Klasse eine Sammlung von Haaren; oder alternativ nur eine Haarpracht - das entscheidest Du selbst. Es muss nur schlüssig sein.
    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:

    Es muss nur schlüssig sein.
    Isses aber nicht. Wie gesagt: Mensch und Hund erben die Behaarung von Säugetier!
    Daraus ergibt sich klar, in welcher Klasse die List(Of Haar) anzusiedeln ist.

    Und wie ebenfalls gesagt: Solange das Klassensystem nichtmal die bislang gegebenen Begriffe korrekt abbildet, lass uns nicht mit Einführung weiterer Begriffen verzetteln.

    Erweitern kann man immer noch, wenn das gegebene Material erstmal stimmig ist.
    (obwohl "Haarpracht" und "Fell" da nicht meine Favoriten wären)
    Jo, ich finde, so passts, und nun fällt mir nix mehr rechtes noch zu sagen ein.
    Vlt. Zusammenfassung: OOP orientiert sich an der realen Welt, und erschafft ein Modell von Wirklichkeit.
    Also Objekte der Wirklichkeit werden miteinander in Beziehung gesetzt.
    Es gibt zwei grundlegende Arten von Beziehung
    Ist-Beziehung - Vererbung
    Hat-Beziehung - Komposition
    Die Hat-Beziehung ist nochmal unterteilbar in "Hat genau ein" und "Hat viele"

    Es sind ganz einfach verständliche Sätze, mit denen eine Beziehung ausgedrückt wird:
    A ist B
    A hat B
    A hat viele B

    Mensch ist Säugetier
    Mensch hat Sprache
    Säugetier hat viele Haare

    Sowas kann man 1:1 in der Code-Architektur abbilden. Diese Abbildung von einfachen Sätzen in Code ist auch umkehrbar. Wenn ich Code sehe (oder im ObjectBrowser angucke), dann kann ich die entsprechenden Sätze bilden und erkennen, ob die Architektur stimmig ist oder nicht.

    Quellcode

    1. Ein FileInfo ist ein FilesystemInfo
    2. Ein DirectoryInfo ist ein FilesystemInfo
    3. FilesystemInfo hat Name und Fullname
    4. FileInfo hat Length
    5. DirectoryInfo hat Parent


    Jo, dassis glaub der Kern von OOP. Naja, einer der Kerne, es gibt noch weitere ganz grundlegende Konzepte. Oder vlt. ist das - Vererbung und Komposition - der innerste Kern, der aller-innerste, und weitere Konzepte sind unbedingt auch zum Kern zu zählen, nur vielleicht ein ganz klein wenig weniger innerlich.
    Naja - da fängt ganz schnell das Streiten wieder an, und die Leuts kommen mit zig weiteren Dingen an, die iwie eingeordnet werden müssen, um der Konfusion zu entgehen.



    Auch zu sagen bleibt noch, dass selbstverfasster Code nur ganz selten Vererbung implementieren muss. Fast immer ist die Architektur über Komposition aufzubauen, also A hat B liegt vor, oder A hat viele B.
    (Das kennste ja noch aus deim Ampel-Programm)
    @ErfinderDesRades @VaporiZed @Haudruferzappeltnoch

    OK. Soweit danke erstmal für deine Mühe und Geduld ( Dank auch an die anderen die sich hier beteiligt haben ) mir das etwas verständlicher zu machen.
    Ich nehme nun mal ein altes Projekt von mir, definiere die Klasse(n) um zu sehen ob das alles so passt.

    EDIT 09:00
    Bevor ich anfange eine Frage.
    Auf der Form habe ich z.B. 3 Buttons. In der Programverarbeitung sollen diese Buttons dann eine Boolean-Variable ändern.

    Wie mache ich das dann in der Klasse richtig?

    VB.NET-Quellcode

    1. Private Button As List(Of Button)
    2. 'ODER
    3. Private B0, B1, B2 As Boolean
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:


    Wie mache ich das dann in der Klasse richtig?

    Da sind wir wieder beim Punkt. In welcher Klasse? Wie ist der Name? Gilt eine hat Beziehung: Klasse hat Booleans? Das ist quasi dein Design jetzt, keine Tiere mehr.

    Die Form, die du hast ist eine Klasse und die hat Controls, zu den Controls zählen z.B. auch die Buttons (Vererbung), die bleiben da besser auch.

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