virtual und abstract in klassen für dumme



  • Hallo leute

    Ich habe im moment das thema klassen 😕 in der schule und komme mit dem irgendwie nicht so ganz klar. ich glaube das grundprinzip habe ich verstanden, aber ich hab mit gewissen sachen noch ein paar probleme.

    kann mir jemand erklären, was genau "virrtual" und "abstract" bedeuten bzw. bewirken? Am besten mit so wenig fachausdrücken wie möglich!

    danke schonmal

    LG
    Barnibas



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wie macht der Hund? Wau!
    Wie macht die Katze? Miau!
    Wie macht der Esel? Ihh-Ahh!

    Das ist virtuell. Jedes Tier nach seiner eigenen Weise.

    Wie macht das Säugetier?
    ??Ähm?? Geht doch nicht?

    Genau, das Säugetier ist abstrakt.

    Quatsch, es ist auch konkret hinsichtlich Atmung und so. Alles ist fast in jeder Beziehung konkret.

    Lustigerweise sind die Aussagen
    "kann nicht so allgemein sagen, wie das Tier macht,"
    und
    "Kleine Erna sieht was und ruft garantiert nicht
    hey, da ist ein Säugetier"
    äquivalent!!!

    Sie hätte natürlich das Tier erkannt. Und das Programm hätte den rechten Laut gespielt. Wenn es möglich wäre, wenn man mehr wüßte als nur die Basisklasse, also den Oberbegriff. Aber das weiß man manchmal nicht. Nur für den seltenen Fall, daß man es mal nicht weiß, wird die ganze Pauke aufgehauen mit der Polymorhie. Und dann lohnt sie sich.



  • ok, du hast es zwar geschafft, kaum fachbegriffe zu verwenden, aber ich habe leider gar nichts von dem verstanden, was du mir sagen wolltest 😕 könntest du es evt nochmal probieren? ich möchte das wirklich verstehen, weil mich das programmieren eig immer interressiert hat, bis dieser m*** kam!

    edit: kannst du es vielleicht mit einem beispiel versehen? dann kapier ichs vielleicht leichter



  • Es gibt sehr viele Beschreibungen im Internet. Hast Du schon mal Wikipedia oder einfach Google bemüht? Das macht doch mehr Sinn, als hier im Forum so eine allgemeine Frage zu stellen. Hier bist Du gut aufgehoben, wenn Du eine konkretere Frage hast.

    http://de.wikipedia.org/wiki/Abstrakte_Klasse wäre vielleicht eine Anlaufstelle.



  • Barnibas schrieb:

    ok, du hast es zwar geschafft, kaum fachbegriffe zu verwenden, aber ich habe leider gar nichts von dem verstanden, was du mir sagen wolltest 😕 könntest du es evt nochmal probieren? ich möchte das wirklich verstehen, weil mich das programmieren eig immer interressiert hat, bis dieser m*** kam!

    Der Mist ist eigentlich ganz einfach.

    Eine Klasse hat Methoden, die statisch genau zu dieser Klasse gehören.

    Im Gegensatz zu einer statischen Methode, die statisch ist - also feststeht, ist eine virtuelle Methode nicht zwangsläufig existent. Eine "pure virtual"-Methode existiert gar nicht, sondern es existiert nur die Behauptung, dass es eine solche Methode ja geben sollte. Ein Tier sollte ein Geräuch machen können, das ist die Behauptung (void GibLaut()), aber mit welcher Methode es das Geräuch macht, wer weiß das schon. Diese "pure virtual" Methoden nennt man auch abstrakt.
    Eine Klasse, die über abstrakte Methoden verfügt (also Methoden, bei denen nur der Name und Parameter bekannt sind, aber nicht die Implementierung) heißt abstrakte Klasse. Man kann nämlich kein Tier mit new erzeugen. Ein Tier ist ja ein abstraktes Konzept.

    Um eine Instanz der Klasse Tier zu erzeugen, muss man das Tier genauer beschreiben. Eine Katze zum Beispiel erbt alle Eigentschaften vom Tier - "eine Katze ist ein Tier" - und implementiert nun die virtuelle Methode "GibLaut" und gibt darin "Miau" aus. Ein Hund ist ebenfalls ein Tier und implementiert die virtuelle Methode "GibLaut" anders.

    Nun kann man kein Tier mit new erzeugen, aber man kann eine Katze erzeugen. Die Katze ist nicht abstrakt, da alle "pure virtual"/"abstrakten" Methoden mit Implementationen überschrieben wurden.

    Da eine Katze aber ein Tier ist, kann man nun schreiben

    Tier tier = new Katze();
    

    "tier" (die Variable) weiß nun nicht mehr, ob es eine Katze oder ein Hund ist. Aber der Datentyp "Tier" weiß, dass Tiere mit "GibLaut" Laute machen können.

    mit

    tier->GibLaut()
    

    wird nun die Methode rausgesucht, die für das jeweilige Tier den passenden Laut erzeugt. Da wir eine Katze erzeugt haben, wird "Miau" auf dem Bildschirm erscheinen.

    Ausführlicher - ebenfalls mit "GibLaut()" - findest Du das ganze hier. Da steht dann auch beschrieben, wie das Ganze in Programmiersprachen umgesetzt wird. OOP ist kein Weltwunder, sondern nur die Lösung für das Problem, dass es für eine Kategorie von Objekten gleichartige Handlungen gibt, die aber unterschiedlich durchgeführt werden. Ein 2d-Objekt (Dreieck, Rechteck, Kreis) kann unterschiedlich beschrieben sein, aber man kann von allen die Fläche berechnen lassen. Dafür braucht man unterschiedliche Methoden. Und das kann man mit einer Klasse wie 2DObjekt dann abstrahieren.


Anmelden zum Antworten