Ankündigung

Einklappen
Keine Ankündigung bisher.

Methode einer abgeleiteten Klasse um Type Hinting ergänzen

Einklappen

Neue Werbung 2019

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

  • #31
    Was genau meinst du jetzt mit "Schnittstelle des Inserts"?
    Dass z.B. ChildOfExpectedClass ein Interface bedient und damit seine Methoden definiert sind.

    Und genau das ist der Fehler. Der Kontext (bzw. die konkrete Klasse) darf keine Rolle spielen.
    Wieso nicht? Dann habe ich ja nicht viel von OOP?!

    Klar wird es vielleicht wenn man DI nutzt. Die Klasse, in die injiziert wird, erwartet ein BaseClass, hat aber keinen Schimmer ob nun ein ExtendedClass1 oder ExtendedClass2 übergeben wurde.
    Das ist schon klar. Anderer Kontext hieße aber DIContainer1 und DIContainer2.
    Sie verlässt sich also darauf das in jedem Fall die Methode eine ExpectedClass akzeptiert.
    Das wäre ja der Fall, wenn vererbte Interface erlaubt wären. Bzw. erbende Objekte sind ja sogar erlaubt. Darum geht es doch in dieser Diskussion. Schau Dir noch mal die Ausgangsfrage an.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #32
      Zitat von nikosch Beitrag anzeigen
      Dass z.B. ChildOfExpectedClass ein Interface bedient und damit seine Methoden definiert sind.
      Dann würde man aber doch direkt das Interface als Type Hint verwenden.

      Und wenn es doch nicht auf ein gemeinsames Interface ankommt sondern auf eine spezialisierte Klasse von ExpectedClass macht es nur Sinn, die Methode zu überladen oder eine weitere einzuführen und nicht die ursprüngliche Methode zu überschreiben

      PHP-Code:
      class SpecializedClass extends BaseClass
      {
        public function 
      doSomethingSpecialized(ChildOfExpectedClass $e) { }

      War doSomething() jedoch abstrakt, stellt sich die Frage ob nicht ein Designfehler bei der Vererbung vorliegt.
      [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
      [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

      Kommentar


      • #33
        War doSomething() jedoch abstrakt
        Darum gehts ja hier.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #34
          Dann wurde mit der abstrakten Klasse ein Interface vorgegeben an dass sich die abgeleiteten Klassen nicht halten können. Also weg mit der abstrakten Deklaration, wenn die Methode ohnehin nur kontextabhängig genutzt wird.
          [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
          [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

          Kommentar


          • #35
            Also weg mit der abstrakten Deklaration, wenn die Methode ohnehin nur kontextabhängig genutzt wird.
            Das ist es ja gerade. Weder das eine noch das andere muss im Praxisfall zutreffen.

            Bsp. grob angelehnt am Ausgangsposting: Ich baue ein Szenario aus Form-Controls und einer View-Komponente. Dann merke ich, es wäre schön, Radio- und Checkboxes als Gruppe behandeln zu können. Also Baue ich bspw. CheckboxGroup als Ableitung von FormControls. Das stellt natürlich andere Anforderungen an die ViewKomponente, darum würde ich gerne die View ableiten und hier als Eingabetyp nur CheckboxGroup zulassen. Geht aber nicht. View würde ich aber auch gerne vererbt lassen, weil
            a) viele HTML-bezogene Ausgabeprozeduren grundlegend gleich sind
            b) die Viewkomponente ja wiederum woanders eingebunden werden kann. Z.B. in ein FormView-Objekt.

            Es mag sein, dass OO das nicht zulässt, allerdings stellt das IMHO durchaus einen typischen Praxisfall dar. Und ich sähe es wirklich nicht problematisch, solange ein TypeHint prüfen würde, ob eine Angabe ein Child der usprünglichen Angabe darstellt.
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar

            Lädt...
            X