Ankündigung

Einklappen
Keine Ankündigung bisher.

Decorator pattern: 'protected' und parallele vererbung

Einklappen

Neue Werbung 2019

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

  • Decorator pattern: 'protected' und parallele vererbung

    PHP-Code:
    <?php

    abstract class {    
        protected abstract function 
    func();
    }

    class 
    Decorator extends {
        private 
    $_decorated;
        public function 
    __construct(A $a) {
            
    $this -> _decorated $a;
        }
        protected function 
    func() {
            
    $this -> _decorated -> func();
        }    
        public function 
    doCall() {
            
    $this -> func();
        }
    }

    class 
    ASmall extends {
        protected function 
    func() {
            
    printf("%s::%s called!\n",__CLASS__,__FUNCTION__);
        }
    }

    $a = new ASmall();
    $dec = new Decorator($a);
    $dec -> doCall();
    ?>
    erwartetes verhalten:
    Code:
    "ASmall::func called!"
    aktuelles verhalten:
    Code:
    Fatal error: call to protected ... in context "Decorator".
    ich halte das für einen bug. ihr auch?

  • #2
    Ich kenne das nur so.
    Die Zugriffsprivilegien gelten doch nur direkt aufwärts (hin zur Grundklasse) in der Vererbungshierachie.
    Nur weil Decorator die Schnittstelle A implementiert/die Klasse A ausbaut, darf es nicht wild auf alle protected Methoden anderer As zugreifen.

    Kommentar


    • #3
      Nope ist kein Bug das hat schon seine Richtigkeit so , protected heisst nix anderes ja du darfst es gern vererben und von der anderen Klasse darauf zugreifen sofern es vererbt wurde. Aber von ausserhalb darauf zugreifen ist nicht.

      Private das wird nicht mal vererbt , wenn du es von ausserhalb der Klasse ausgeben möchtest musst Du die Klasse auf Public setzen.

      Kommentar


      • #4
        Zitat von Bruchpilot
        Ich kenne das nur so.
        Die Zugriffsprivilegien gelten doch nur direkt aufwärts (hin zur Grundklasse) in der Vererbungshierachie.
        Nur weil Decorator die Schnittstelle A implementiert/die Klasse A ausbaut, darf es nicht wild auf alle protected Methoden anderer As zugreifen.
        in java schon - und ich hätte jetzt schon gemeint, dass es sinn macht, schließlich sollte der decorator für klienten und 'dekoriertes objekt' gleichermaßen transparent sein.

        interpretationssache... derzeit bleibt wohl nichts anders übrig, als das ganze public zu machen.

        grüße
        axo

        Kommentar


        • #5
          protected in Java ist ja auch vollkommen im Arsch, da kannst Du vom ganzen Package aus drauf zugreifen, zusätzlich zu den Klassen die davon vererben.
          mod = master of disaster

          Kommentar


          • #6
            Örx.
            Das kennt C# zwar auch so ungefähr, aber dafür gibt es einen eigenen Zugriffsmodifizierer: internal (innerhalb der Kompilierungseinheit public, nach aussen nicht exportiert/sichtbar).
            protected verhält sich dabei analog zu C++.

            Kommentar

            Lädt...
            X