Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Interface vs. Abstract

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Interface vs. Abstract

    Hallo zusammen,

    ich frage mich gerade welchen Vorteil ein Interface gegenüber einer abstrakten Klasse bietet und ob es Regeln oder Hinweise gibt wann ich was benutzen sollte?

    Wenn ich also allgemein gültige Methoden verwenden möchte benutze ich natürlich eine abstrakte Klasse um nicht den selben Code für jede Klasse die das Interface implementiert schreiben zu müssen.

    Wenn ich nun solche Methoden aber nicht brauche, bedeutet das "automatisch" das ich ein Interface nutzen kann/darf/sollte oder gibt es noch andere Richtlinien?

    Ich persönlich sehe den Vorteil einer abstrakten Klasse - auch wenn ich keine allgemein gültigen Methoden zum Zeitpunkt der Erstellung benötige - darin, dass ich eben flexibler bin und eben solche ggf. jederzeit hinzufügen kann.
    Von daher schreckt mich ein Interface eigentlich eher ab
    Ok, das ich mir diese Möglichkeit offen lassen möchte zeugt wahrscheinlich eher davon, dass ich noch nicht wirklich viel Ahnung von Softwaredesign habe...

    Trotzdem Hat zufällig jemand ein Beispiel für mich wo man 100%ig sagen könnte: "Das ist ein Interface, eine abstrakte Klasse wäre hier sinnlos"?
    Bei den Beispielen die ich bis jetzt gesehen habe, hab ich mir immer gedacht "Also ich hätte ne abstrakte Klasse dafür genommen"
    Hilfe, mein Ball ist umgekippt!


  • #2
    Schau mal hier nach
    http://www.php.net/~helly/php/ext/spl/

    Vielleicht helfen dir ja die Interfaces, die es von PHP wirklich gibt.

    edit: In PHP gibt es (sinnvoller Weise!?) keine Mehrfachvererbung. Über Interfaces kannst du aber dennoch erreichen, dass ein Objekt "quasi" mehrere Typen bedienen kann.
    Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
    Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)

    Kommentar


    • #3
      Ein Vorteil:
      Du kannst mehrere Interfaces einbinden aber nur von einer Abstrakten Klasse erben.
      "Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]

      Kommentar


      • #4
        Interfaces dienen zur Spezifikation einer Schnittstelle. Die sind nicht dazu da, den Programmierer einzuengen oder zu ärgern, sondern dazu, damit andere Programmteile sich darauf verlassen können, dass eine Klasse bestimmte Methoden implementiert.
        Die Interfaces der SPL sind übrigens Sonderfälle und dienen dem Hinzufügen von Extra-Funktionalitäten, was eigentlich nicht Aufgabe von Interfaces ist. In diesem Falle wurden nur aus naheliegenden Gründen Interfaces genutzt, da entsprechende Funktionalitäten nicht selten genormte Schnittstellen benötigen.
        Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

        Kommentar


        • #5
          Schonmal Danke euch allen!
          Langsam verstehe ich die Argumentation mit Interfaces so eine Art Mehrfachvererbung zu simulieren.
          Leider finde ich aber für mich noch kein nachvollziehbares Beispiel das wirklich Sinn macht

          Zitat von Manko10 Beitrag anzeigen
          Interfaces dienen zur Spezifikation einer Schnittstelle. Die sind nicht dazu da, den Programmierer einzuengen oder zu ärgern, sondern dazu, damit andere Programmteile sich darauf verlassen können, dass eine Klasse bestimmte Methoden implementiert.
          Aber genau das erreiche ich doch auch mit abstrakten Klassen, oder?
          Also das "darauf verlassen können".
          Hilfe, mein Ball ist umgekippt!

          Kommentar


          • #6
            Abstrakte Klassen haben aber noch einen etwas anderen Anwendungsfall. Hier können diverse Methoden als abstrakt definiert, aber auch konkret implementiert werden. Konkrete Klassen werden dann aber direkt über Vererbung implementiert, stellen aber nicht in dem Sinne bloß die Schnitstellendefinition der Klasse dar. Abstrakte Klassen können auch private Methoden enthalten, stellen also nahezu vollwertige Klassen dar mit dem Unterschied, dass diese nicht direkt abgeleitet werden können. Interfaces jedoch enthalten nur abstrakte public-Member.
            Dass Interfaces Mehrfachvererbung ermöglichen, ist Quatsch. Interfaces werden nicht vererbt, sondern implementiert, da hierbei keinerlei konkrete Implementierung vorgegeben ist, die geerbt werden könnte. Deshalb kann eine Klasse auch mehrere Interfaces implementieren, aber nur eine abstrakte Klasse beerben.
            Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

            Kommentar


            • #7
              @manko
              mit "Mehrfachvererbung simulieren" meinte ich, dass eine Klasse 2 oder mehr Interfaces implementieren kann, womit ich mich (wie von dir vorhin erwähnt) darauf verlassen kann, dass die entspr. Klasse alle benötigen Methoden bereit stellt. Mit Vererbung kann ich soetwas nicht erreichen. War wohl etwas primitiv ausgedrückt, sollte aber so stimmen, oder?

              Über den Rest den du geschrieben hast muss ich mir noch länger/genauer Gedanken machen.
              Enthält für meine Verhältnisse doch recht viel "Fachchinesisch" *ab zu Google*
              Hilfe, mein Ball ist umgekippt!

              Kommentar


              • #8
                *ab zu Google*
                Guter Vorsatz, leider viel zu selten gehört hier.

                Als Faustregel zur Nutzung von Interfaces vs abstrakte Klassen könntest du dir merken, dass eine abstrakte Klasse eine Referenzimplementierung für eine mehr oder weniger konkret bekannte Aufgabe darstellt, während ein Interface unspezifischer ist und auch von Klassen implementiert werden kann, die eine vollkommen eigene Aufgabe erfüllen (bspw. Plugin-System).
                Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                Kommentar


                • #9
                  Mit den genannten Hinweisen und einigen Nachforschungen ist mir die Sache nun halbwegs klar.
                  Also danke nochmal!
                  Hilfe, mein Ball ist umgekippt!

                  Kommentar


                  • #10
                    übrigens, Interfaces kann man auch prima für’s type hinting benutzen.

                    Kommentar

                    Lädt...
                    X