[OOP] Überladen von klassenvariablen

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

  • [OOP] Überladen von klassenvariablen

    hmm, also ich hab hier gerade ein problem mit einer klassenvariable, die scheinbar nicht die klassenvariable der mutterklasse überschreibt.

    der punkt ist, ich nutze eine geerbte methode der mutterklasse, bei der jedoch auch der inhalt der konstanten klassenvariable der mutterklasse eingefügt wird, statt der neuen konstanten, die ich in der abgeleiteten klasse definiert habe.

    fehler meinerseits?

  • #2
    die Mutterklasse kann ja deine neu definierte Variable in
    der abgeleiteten Klasse nicht kennen.

    Versuche mal die Variable zu setzen, ohne sie in der abgeleiteten
    Klasse zu definieren, sie wird ja vererbt *g*.

    Wenn es eine Konstante ist, haste da wohl keine Chance
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      hmm ...
      gut, also ich versuch nochmal was genauer zu erklären, weil ich nicht weiß, ob die richtigen begrifflichkeiten verwendet habe.

      bei der variable handelt es sich im grunde um eine instanzvariable, die allerdings für jede instanz konstant ist.
      der konstante inhalt ist eben nur von klasse zu klasse verschieden.

      *teste*
      ... habe gerade getestet, ob ich den inhalt der variable im konstruktor der jeweiligen klasse definieren kann. auch das geht nicht.

      hmm .. dann ist die vererbungs-möglichkeit aber wirklich schlecht implementiert, weil ich nutze ja wirklich die methode der mutterklasse und nicht die geerbte methode.

      EDIT:
      Hat denn jemand eine Idee für eine Alternative, ohne die Methode komplett neu zu implementieren?
      Zuletzt geändert von graf; 23.11.2003, 11:56.

      Kommentar


      • #4
        bei dir ist so?
        PHP-Code:
        class {
           var 
        $x 1;
           function 
        abc(){
              echo 
        $this->x;
           }
        }

        class 
        extends A{
           var 
        $x 2;
           function 
        xyz(){
              
        $this->abc();
           }

        da KANN er nur "1" ausgeben, da $x in class A und B was anderes
        ist ! Wenn mußt du schon $x einen neuen Wert geben:
        PHP-Code:
        class extends A{
           
        // var $x = 2;
           
        function xyz(){
              
        $this->2;
              
        $this->abc();
           }

        TBT

        Die zwei wichtigsten Regeln für eine berufliche Karriere:
        1. Verrate niemals alles was du weißt!


        PHP 2 AllPatrizier II Browsergame

        Kommentar


        • #5
          ja, so ist es bei mir ...

          aber das es so gemacht werden muss ist einfach nicht richtig.
          in java z.b. funktioniert das, so wie es sollte.

          da in der methode der mutterklasse "$this->x" steht, und ich mich bei aufruf der geerbeten methode in der tochterklasse befinde, enthät x dort auch den wert der tochterklasse.

          und da es sich schon um eine etwas umfangreichere klasse handelt, kommt deine möglichkeit auch nicht in frage, weil dann müsste ich das für jede geerbte methode machen und DAS wäre viieeel arbeit.

          aber das was PHP da macht, kann nicht wirklich gute OOP sein, wobei das ja auch bekannt ist.

          Kommentar


          • #6
            wenn du in der abgeleiteten Klasse $x neu definierst,
            ist es nunmal eine andere Variable.
            Dies ist auch unter Java oder C++ nicht anders.
            TBT

            Die zwei wichtigsten Regeln für eine berufliche Karriere:
            1. Verrate niemals alles was du weißt!


            PHP 2 AllPatrizier II Browsergame

            Kommentar


            • #7
              ich deklariere es ja nicht neu, ich weise der variablen mittlerweile im konstruktor der der abgeleiteten klasse einen neuen wert zu.
              PHP-Code:
              class {
                var 
              $x;
                
                function 
              A() {
                  
              $this->x=1;
               }
                
                function 
              getValue() {
                  return 
              $this->x;
                }
              }

              class 
              extends {
                function 
              B() {
                  
              $this->2;
                }

              und zur verwendung:
              PHP-Code:
              $b = new B();
              echo 
              $b->getValue(); 
              und dann erwarte ich (zumindest bei einer "guten" OOP-sprache), dass er mir die "2" ausgibt. und genau das brauche ich. ansonsten kann ich die klasse neu schreiben und kann sie leider nicht "extenden".

              und jetzt ist es auch eine instanzvariable und wenn das nicht funktioniert, dann ... ka
              Zuletzt geändert von graf; 23.11.2003, 12:50.

              Kommentar


              • #8
                ich habs jetzt gerade nochmal in Java getestet.
                Code:
                public class A1 {
                  public int i;
                  public A1() {
                    this.i=1;
                  }
                
                  public int getValue() {
                    return this.i;
                  }
                }
                
                
                public class B1 extends A1{
                  public B1() {
                    this.i = 2;
                  }
                
                
                  public static void main(String[] args) {
                    B1 b = new B1();
                    System.out.println(b.getValue());
                  }
                }
                ergebnis der ausgabe: 2

                aber gut, wenn es in php nicht so ist, dann muss ich die klasse halt komplett kopieren.

                Kommentar


                • #9
                  ahh, dein Problem liegt NICHT an $x,
                  sondern am Konstruktor der Klasse B

                  Kurz im Handbuch nachgeschlagen bringt:

                  Der Konstruktor der Mutterklasse wird nicht automatisch
                  aufgerufen, wenn die ableitende Klasse selber einen
                  Konstruktor besitzt


                  da mußt in B::B() schon ein $this->A() aufrufen
                  TBT

                  Die zwei wichtigsten Regeln für eine berufliche Karriere:
                  1. Verrate niemals alles was du weißt!


                  PHP 2 AllPatrizier II Browsergame

                  Kommentar


                  • #10
                    doch, das problem liegt bei $x.

                    denn bei aufruf der methode der mutterklasse aus der tochterklasse, wird der inhalt der (geerbeten) instanzvariable einfach nicht beachtet, sondern es wird der inhalt genommen, der im konstruktor der mutterklasse zugewiesen wurde.
                    ob ich im konstruktor der tochterklasse einen neuen inhalt zuweise, ist der methode scheinbar sch****egal.

                    und ich hoffe ich kann dies umgehen, indem ich den inhalt der variable als parameter an den konstruktor übergebe. *teste*

                    Kommentar


                    • #11
                      bringt 2:
                      PHP-Code:
                      class A{
                          var 
                      $x=0;
                          function 
                      A(){
                              
                      $this->x=1;
                          }
                          function 
                      getValue(){
                              return 
                      $this->x;
                          }
                      }

                      class 
                      extends A{
                          function 
                      B(){
                              
                      //$this->A();
                              
                      $this->x=2;
                          }
                      }

                      $b = new B();
                      echo 
                      $b->getValue(); 

                      bringt 1:
                      PHP-Code:
                      class A{
                          var 
                      $x=0;
                          function 
                      A(){
                              
                      $this->x=1;
                          }
                          function 
                      getValue(){
                              return 
                      $this->x;
                          }
                      }

                      class 
                      extends A{
                          function 
                      B(){
                              
                      $this->A();
                              
                      //$this->x=2;
                          
                      }
                      }

                      $b = new B();
                      echo 
                      $b->getValue(); 
                      bringt 0:
                      PHP-Code:
                      class A{
                          var 
                      $x=0;
                          function 
                      A(){
                              
                      $this->x=1;
                          }
                          function 
                      getValue(){
                              return 
                      $this->x;
                          }
                      }

                      class 
                      extends A{
                          function 
                      B(){
                              
                      //$this->A();
                              //$this->x=2;
                          
                      }
                      }

                      $b = new B();
                      echo 
                      $b->getValue(); 
                      TBT

                      Die zwei wichtigsten Regeln für eine berufliche Karriere:
                      1. Verrate niemals alles was du weißt!


                      PHP 2 AllPatrizier II Browsergame

                      Kommentar


                      • #12
                        ok, jetzt geht's ...
                        hatte meinen code mittlerweile doch etwas versaut.

                        nun funktioniert's erwartungsgenäß.

                        Kommentar


                        • #13
                          Zum Aufruf des Parent-Constructors verwendet man allerdings eigentlich:
                          PHP-Code:
                          parent::A(); 
                          und nicht
                          PHP-Code:
                          $this->A(); 
                          carpe noctem

                          [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                          [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                          Kommentar


                          • #14
                            und ganz eigentlich sollte der constructor __construct (oder so ähnlich) heißen, zumindest ab php 5. das erspart einem auch unnötigen aufwand, wenn man seine hierarchie ändert

                            in php < 5 wird dann in der function classname() eben dieser construcotr aufgerufen und gut is
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              habs auch gerade gelesen ...
                              wobei man ab php5 eh erst von der eigentlichen oop sprechen kann, bisher ist es ja doch eher ein "der anfang ist gemacht"

                              Kommentar

                              Lädt...
                              X