Frage zur Vererbung

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

  • Frage zur Vererbung

    Hi,

    bei mir gibt es eine Elternklasse und jeweils 4 Kindklassen. Unter anderem wird in 2 Kindklassen eine Funktion benötigt, jedoch in der 3. und 4. nicht.

    Sollte diese Funktion trotzdem in die Elternklase geschrieben werden oder gibt es dafür eine bessere Lösung?

  • #2
    Wenn man in der Elternklasse etwas definiert, was in der Kindklasse nicht gebraucht wird, dann hat man meist was falsch gemacht.

    Alternativ:
    Definiere "es" als Interface. Implementiere "es" nur in den Klassen, welche "es" auch benötigen.
    Oder http://en.wikipedia.org/wiki/Delegation_(programming)
    Oder ab php5.4 evtl. auch als trait
    Wir werden alle sterben

    Kommentar


    • #3
      Hallo,

      ohne genauere Angaben zum beabsichtigten Zweck ist es schwierig, konkrete Vorschläge zu machen. Einserseits können die Vorschläge von Combie sinnvoll sein, in bestimmte Fällen macht aber vielleicht ein Decorator-Pattern mehr Sinn oder es läuft darauf hinaus, dass sich zwei der Kindklassen besser von einer weiteren Klasse ableiten, die ihrerseits Kind deiner Elternklasse ist.

      Welche Variante davon nun die beste ist, hängt aber stark vom Anwendungsfall ab.

      Gruß,

      Amica
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        Hi,

        danke für die Antworten.
        Ich habe es jetzt so gemacht:

        Zitat von AmicaNoctis Beitrag anzeigen
        oder es läuft darauf hinaus, dass sich zwei der Kindklassen besser von einer weiteren Klasse ableiten, die ihrerseits Kind deiner Elternklasse ist.
        Die Klassen, die die noch weitere Funktionalitäten benötigen erben von einer weiteren Klasse, alles anderen Klassen erben von einer anderen Klasse

        PHP-Code:
        class A{}
        class 
        extends A
        class extends // erweiterte Funktionallität
        class extends // erweiterte Funktionalität
        class extends 

        Kommentar


        • #5
          Sollten das nicht abstrakte Klassen sein?

          Kommentar


          • #6
            Es müsste aber nur class A abstract sein oder?

            Kommentar


            • #7
              Das ist nicht pauschal zu beantworten. Klassen, die nicht instanziiert werden müssen/sollen/dürfen, sind diejenigen, die auf abstract gesetzt werden könnten.

              Das beste Beispiel ist eben die Klasse, die nur deshalb existiert, um gemeinsame Funktionalität unredundant für weitere konkrete Kindklassen zur Verfügung zu stellen. Solche Klassen erfüllen keinen konkreten Zweck, sondern liefern nur Kindklassen Werkzeuge zur Erleichterung ihrer Arbeit, bilden also eine unfertige Schablone.

              Kommentar


              • #8
                Hi,

                ich habe nun noch ein Problem, wenn ich die Vererbung so nutze:

                PHP-Code:
                class A{}
                class 
                extends A
                class extends // erweiterte Funktionallität
                class extends // erweiterte Funktionalität
                class extends 
                Es gibt eine Funktionalität, die von Klasse B und C benötigt wird. Nun kann man ja nicht von 2 Klassen erben. Gibt es da noch eine andere Lösung?

                Kommentar


                • #9
                  Kommt drauf an, um was für eine Funktionalität es sich handelt.

                  Kommentar


                  • #10
                    Ich baue mir einer Abfrage zusammen die ich in diesen Klassen benötige. Möchte diese aber nicht doppelt schreiben.

                    Kommentar


                    • #11
                      B und C liegen doch im selben Zweig. Alles was B kann, kann C auch. Oder geht es dir darum, dass D es nicht können soll?

                      Konkretisier doch bitte mal deine Klassen und Methoden durch echte Namen. Dann könnte man erstmal eine Idee bekommen, worum es geht und vielleicht noch andere mögliche Lösungen vorschlagen.

                      Edit: Evtl. kommst du besser, wenn du die benötigten Abfragen (ich vermute mal, es geht um SQL-Code) auslagerst und nachlädst, statt sie direkt in den PHP-Code zu schreiben.
                      Zuletzt geändert von AmicaNoctis; 11.09.2011, 11:53.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Hi,

                        sorry, mein Fehler. Ich meinte im Beispiel Klasse C und E und hatte nur deswegen gefragt:

                        Zitat von combie Beitrag anzeigen
                        Wenn man in der Elternklasse etwas definiert, was in der Kindklasse nicht gebraucht wird, dann hat man meist was falsch gemacht.
                        Ansonsten könnte man ja alles in Klasse A schreiben

                        Es geht um 5 Hersteller. Für jeden Hersteller muss ich u.a. einen SQL-Query zusammenbauen. Bei manchen Herstellern sind Teile des Query identisch und das wollte ich auslagern. Diese identischen Teile werden jeweils auch dynamisch zusammengebaut.

                        Kommentar


                        • #13
                          Bleibt für mich die Frage: Was haben SQL-Queries bei einem Hersteller verloren?

                          Kommentar


                          • #14
                            Und, was unterscheidet die Hersteller derart, dass eigene Klassen für sie überhaupt gerechtfertigt sind?
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Oder, um beim SQL-Problem zu bleiben: Wie unterscheiden sich diese dynamischen Abfragen und kann man sie nicht vielleicht vereinen und nur über WHERE und ggf. HAVING parametrisieren?
                              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                              Super, danke!
                              [/COLOR]

                              Kommentar

                              Lädt...
                              X