Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Verständnis von Vererbungen und Klassenabstraktion

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Verständnis von Vererbungen und Klassenabstraktion

    Hallo Leute,

    ich beschäftige mich seit einiger Zeit mit Vererbungen und neuerdings auch mit Klassenabstraktion.

    Jetzt habe ich mir heute mal die Frage gestellt ob ich diese, so wie vorgesehen, gebrauche oder eher missbrauche. Der Grund wieso ich mir diese Frage gestellt habe ist der, dass ich das gefühl habe die können mehr als ich damit mache.

    Vererbung:
    Wir haben Klasse a, b, c und d. Diese sind zum grossteil identisch, also definiert man eine Klasse e die alles beinhaltet was diese Klassen gemeinsam haben und definiert in den Klassen selbst nur die Unterschiede.

    Abstrakte Vererbung:
    siehe Vererbung + ich kann eine funktion als abstract deklarieren und dadurch die Kindklassen dazu zwingen diese zu definieren.

    Kann mir einer sagen ob das wirklich alles ist was ich damit machen kann oder ob es noch mehr Gründe gibt?

    Danke & Gruß
    Squall


  • #2
    Bspw. kann man über die Elternklasse einen Objekttypus bestimmen und erzwingen. Über Type-Hinting kannst Du einer Methode einen Objektparameter erzwingen, der nur Elemente einer Klasse oder deren Ableitung zulässt. Ähnliches geht mit dem instanceof-Keyword.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Ausserdem ist die Abstraktion einer Klasse sehr hilfreich, um einen bestimmten Kontext einzuhalten. Bestimmte Methoden könnte man auch mit einem Interface vorgeben, wenn auch nur öffentliche. Und auch hier kannst du über Type Hinting vorgeben, welchen Objekttypus ein Parameter haben muss. Also wie ich bereits sagte, ist es auch sinnvoll abstrakte Klassen für den bestimmten Kontext zu nutzen. Besonders deutlich wird das in dem Beispiel des Buches "PHP - Design Patterns". Man hat hier eine Klasse Cabrio, die von einer Klasse Auto erbt. Ein Cabrio kann aber auch Verschiedenheiten haben. Wie das Öffnen des Daches. Es gibt Cabrios die das Dach automatisch öffnen lassen und es gibt wiederum welche, bei denen man das Dach manuell öffnen muss. Deswegen wird in dem Beispiel die Klasse für Cabrios als abstrakt deklariert und eine abstrakte Methode openRoof(); hinzugefügt. Jede Klasse, die nun von der Cabrio Klasse abgeleitet wird, muss nun die Methode openRoof() mit Leben füllen. Hier ist es dann sinnvoll, eine Klasse zu schreiben, die de openRoof() Methode so implementiert, dass sie ein Dach automatisch öffnet und eine Klasse, die das Dach allerdings Manuell öffnet. Durch Abstraktionen wird der Umfang der Klassen zwar immer größer, aber man hat immer eine parat, passend zum Kontext. Und macht den Main-Code schlanker.

      Kommentar


      • #4
        Wie meinst du das? Type-Hinting kann ich genauso auch ohne vererbungen verwenden.

        Vielleicht kann ich mich mal wieder nicht richtig ausdrücken. Ich formuliere das ganze mal um.

        Ich sehe folgende Vorteile:

        Bei Vererbung:
        - Ich kann Methoden nur einmal definieren und diese in vielen anderen klassen verwenden

        Bei Abstraktion:
        - Ich bekomme eine fehlermeldung wenn ich vergessen habe, in einer erbenden Klasse, eine Methode zu definieren

        Der Vorteil bei Vererbungen ist natürlich riesig, da man sich enorm viel Zeit sparen kann. Aber das was eine Abstrakte klasse zusätzlich bietet finde ich irgendwie schwach, daher vermute ich das ich das Thema Klassenabstraktion nicht richtig verstanden habe.

        Fragen:
        - Gibt es noch mehr Voreteile die ein Vater-Kind Modell bietet?
        - Welche Vorteile bietet eine Abstrakt definierte Vaterklasse gegenüber einer normalen Vaterklasse?

        Edit:
        @Tidus
        Ich kann aber die Methode operRoof auch in beiden Kindklassen definieren ohne die Vaterklasse als abstract zu definieren

        Kommentar


        • #5
          Bitte lies unsere Beiträge noch mal genau! Das scheint mir eher das Problem zu sein.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Die Abstraktion ist natürlich nichts was dir vom Programmcode her Vorteile liefert. Aber sowas ist gerade bei Projekten mit mehreren Mitarbeitern nützlich. Wenn es eine Vaterklasse gibt und jetzt ein anderer Programmierer eine Klasse implementiert die von der Vaterklasse erbt dann kann er "nicht vergessen" eine bestimmte Methode zu implementieren.

            Beim Type-Hinting hast du bei vererbt Klassen den Vorteil nicht nur ein bestimmtes Objekt zu erlauben sondern eine ganze Klasse/Gruppe von Objekten. Stell dir vor du hast die Vaterklasse Auto und die Ausprägungen Audi, BMW, VW. Da alle von Auto erben besitzen sie z.b. eine bestimmte Methode die von einem Objekt genutzt werden soll. Bei diesem Objekt übergeb ich also das Auto als Parameter und das Objekt ruft dann die entsprechende Methode auf. Um zuzusichern dass sich das Objekt um ein Auto handelt kann man per Type-Hinting eben angeben "Auto" somit kann ich alle Objekte übergeben die von Auto erben. Ohne die Vererbung könnte ich z.b. nicht sagen das Objekt muss vom Typ Audi, BMW oder VW sein.

            Kommentar


            • #7
              Ja, natürlich kannste du beiden Methoden auch so implementieren. Aber der Sinn liegt ja darin, eine klare Struktur in die Klassen zu bekommen. Ein Cabrio, welches das Dach automatisch öffnet, brauch zum beispiel einen anderen Methodenrumpf, als ein Cabrio, bei dem man das Dach manuell öffnen muss. Dazu kommt ja auch noch, das man abstrakte Klassen nicht instanzieren kann. Du musst dich dann also entscheiden ob du ein automatisches Cabrio haben willst oder ein manuelles.. Beide implementieren die openRoof() Methode, aber beide auf verschiedene Weise. Du könntest auch die Vererbung komplett weglassen, wenn dir das lieber ist ^^. Ich hoffe du hast den Sinn nun verstanden.

              Kommentar


              • #8
                Hier noch mal zur veranschaulichung:

                Klasse Car:

                PHP-Code:
                class Car {

                    protected 
                $_started;

                    public function 
                startEngine() {
                        
                $this->_started true;
                    }

                    public function 
                stopEngine() {
                        
                $this->_started false;
                    }

                So und nun möchtest du auch Cabrios erzeugen können. Diese können ihr Dach öffnen und schließen:

                PHP-Code:
                class Convertable extends Car {
                    
                    protected 
                $_roofOpen false;

                    public function 
                openRoof() {
                        
                $this->_roofOpen true;
                    }

                    public function 
                closeRoof() {
                        
                $this->_roofOpen false;
                    }

                Jetzt stellst du fest: "Oh mist, es gibt Cabrios, die ihr Dacht automatisch schließen und öffnen können und es gibt welche, die dies manuell machen. Aber beide können es. Also brauchen beide die Methoden openRoof() und closeRoof(), aber beide machen es anders. Also abstrahierst du diese Methode, womit die komplette klasse abstrakt wird und implementierst dann in den jeweiligen unterklassen den konkreten code:

                Cabrio Klasse jetzt:
                PHP-Code:

                abstract class Convertable extends Car{

                    protected 
                $_roofOpen false;

                    abstract public function 
                openRoof();

                    abstract public function 
                closeRoof();

                Und eine Klasse die zum beispiel Cabrios darstellt, die das dach automatisch öffnen:
                PHP-Code:
                class AutomaticConvertable extends Convertable {

                   public function 
                openRoof() {
                      
                $this->_openRoof true;
                   }

                   public function 
                closeRoof() {
                     
                $this->_openRoof false;
                   }

                Hier eine Klasse die das manuell macht:

                PHP-Code:

                class ManualConvertable extends Convertable {

                     public function 
                openRoof() {
                         
                // dieser methoden rumpf ist anders als bei AutomaticConvertable
                     
                }

                     public function 
                closeRoof() {
                        
                // hier auch
                     
                }

                So das reicht aber nun an erklärungen ^^

                Kommentar


                • #9
                  @nikosch
                  Falls ich etwas nicht oder falsch verstanden habe währe es schön wenn du mir einen Tipp geben kannst, was ich daran nicht oder falsch verstanden habe.

                  @Florian
                  Selbes lässt sich aber auch mit is_subclass_of() auffangen

                  @Tidus
                  Hatte es auch vor dem Beispiel verstanden, bin nur nicht so schnell mit antworten . Trotzdem danke dass du dir die mühe gemacht hast.

                  Fazit aus all eueren kommentaren:
                  - Klassenvererbung bietet Vorteile in sachen Redundanz
                  - Abstraktion bringt zusätzlich noch Struktur in die Sache und verhindert dass benötigte methoden in den abgeleiteten Klassen vergessen werden

                  Ist das so korrekt?

                  Kommentar


                  • #10
                    Ja das sind Grundsätzliche Features die Objektorientierung bietet. Natürlich kannst du das ganze auch simulieren mit verschiedenen Funktionen oder durch [MAN]Reflection[/MAN]. Ist dann aber entsprechend umständlich.

                    Kommentar


                    • #11
                      [OT] Also die Auto-Beispiele finde ich immer wieder göttlich.
                      Alsi ich musste zumindest noch nie ein Auto programmieren.

                      Kommentar


                      • #12
                        Es gibt halt wenige theoretische Beispiele, die man ableiten kann. Bei Tieren/Menschen ist das wesentlich schwerer vorstellbar. Bei Technik kann man sich eher ein allgemeines Etwas vorstellen. Für ein Kind ist ein Klotz mit 4 Rollen dran eben auch ein Auto. Bis zu einem gewissen ALter auch ein Traktor, Mercedes oder ein Linienbus. Ein allgemeines „Tier“ kann es dagegen nicht gegenständlich erfahren, dass ist schon ein kognitives Konstrukt. Ein Kind sagt daher eher den konkreten Tiernamen (oder einen eines ähnlichen Tiers), als dass es „Tier“ sagen wird. Denk mal drüber nach.

                        Squall: Meine ANtwort bezog sich darauf,
                        - dass Du Deine Frage komplett wiederholt hast, als hätten wir Dich nicht verstanden
                        - auf die Sache mit dem Type Hinting. Nur weil etwas woanders „auch geht“, sagt das ja niochts über den konkreten Fall aus, den wir ja beschrieben haben.
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Reflection schaue ich mir morgen gleich mal an.

                          Danke erstmal euch allen

                          @hpf
                          Lieber Autos als Socken! Ich durfte OOP anhand einer Sockenfabrik, die Socken in verschiedenen Farben und Größen herstellt kennenlernen

                          Kommentar


                          • #14
                            Reflection kannst Du Dir für den Einstieg eigentlich sparen. Das ist eher verwirrend. Ist ein ähnliches Konzept wie „Parser tokens“ oder anonyme Funktionen und eval.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              Reflection ist ein bisschen was für allwissende Zauberer.

                              Kommentar

                              Lädt...
                              X