JürgenB: Prototypische Erweiterung und private Variablen

Hallo,

ich benötige etwas Nachhilfe in Sachen OOP: Wenn ich in einer Funktion Untermethoden mit this.xxx=function() definiere, kann ich in diesen auch auf private Variablen aus der übergeordneten Funktion zugreifen. Erweitere ich aber eine Funktion per prototype, geht dieses nicht. Das folgende Beispiel zeigt mein Problem:

  var o = function() {  
    var p = "Privat";  
    this.e = "Öffentlich";  
    this.f1 = function() {  
      alert("f1:"+p+" "+this.e) ; // OK  
    }  
  }  
  o.prototype.f2 = function() {  
      alert("f2:"+this.e) ;       // OK  
      alert("f2:"+p) ;            // Fehler: p is not defined  
  }  
  
  var ob = new o() ;  
  ob.f1();  
  ob.f2();  

gibt es eine Möglichkeit, auch aus "f2" auf "p" zuzugreifen?

Gruß, Jürgen

  1. gibt es eine Möglichkeit, auch aus "f2" auf "p" zuzugreifen?

    Nein. Im OOP Slang entsprechen die Funktion im der Konstruktorfunktion den privilegiert Funktionen, nur diese dürfen auf private Funktionen und Attribute zugreifen.

    Struppi.

    1. Hallo Struppi,

      dann muss ich ja nicht weiter suchen. Danke!

      Gruß, Jürgen

  2. Hallo,

    Bin ich iwie bescheurt? Bei mir kann ich auf private zugreifen, aber ich muss noch var _t = this; machen, damit ich aus untermethoden _t.variable nutzen kann??

    mfg, Flo

    --
    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
    1. Hallo levu,

      Bin ich iwie bescheurt?

      das weiß ich auch nicht. *g*

      Bei mir kann ich auf private zugreifen, aber ich muss noch var _t = this; machen, damit ich aus untermethoden _t.variable nutzen kann??

      auch auf Variablen, die wie in meinem Beispiel mit var deklariert wurden?

      Gruß, Jürgen

      1. Hallo,

        Bin ich iwie bescheurt?
        das weiß ich auch nicht. *g*

        Ich bins nicht, aber mein(e) Browser *g* (bzw. eure)

        auf var-variablen kann ich so zugreifen, und auf this.-variblen nur mit _t (var _t = this)... naja, is ja auch egal.

        mfg, Flo

        --
        sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
        1. Hallo levu,

          auf var-variablen kann ich so zugreifen, und auf this.-variblen nur mit _t (var _t = this)... naja, is ja auch egal.

          zeig mal ein Beispiel. Was passiert bei meinem Beispiel?

          Gruß, Jürgen

          1. Hallo,

            <html>  
            <head>  
            <script type="text/javascript">  
            function o() {  
             var x = 'x';  
             this.y = 'y';  
             var _t = this;  
             this.method = function() {  
              try {alert(x);} catch(e) {alert('x not defined');}  
              try {alert(y);} catch(e) {alert('y not defined');}  
              try {alert(_t.x);} catch(e) {alert('_t.x not defined');}  
              try {alert(_t.y);} catch(e) {alert('_t.y not defined');}  
             }  
            }  
            function test() {  
             var a = new o();  
             a.method();  
            }  
            </script>  
            </head>  
            <body onload="test()">  
              
            </body>  
            </html>
            

            mfg, Flo

            --
            sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
            1. Du hast es nicht verstanden.

              function o() {

              Das ist der Konstruktor (bzw. die Konstruktorfunktion), üblicherweise werden diese mit einem Großbuchstaben am Anfang benannt, also in der Form: _K_onstruktor() oder in deinem Fall O(), das aber nur als Ratschlag.

              var x = 'x';
              this.y = 'y';

              x ist eine private Variabel, die nur in der Konstruktorfunktion erreichbar ist, es gibt hier keine Variabel this.x. this.y ist öffentliche Variabel, auf die du von überall zugreifen kannst, es gibt aber keine Variabel y

              var _t = this;

              Das ist in diesem Kontext, absolut überflüssig und führte dich offensichtlich auf eine falsche Spur.

              this.method = function() {
                try {alert(x);} catch(e) {alert('x not defined');}

              x ist deklariert und du kannst hier auf x zugreifen, da this.method() eine priviligierte Methode ist, wie ich es eingangs schon erwähnte.

              try {alert(y);} catch(e) {alert('y not defined');}

              y existiert nicht, daher wird hier ein Fehler ausgelöst.

              try {alert(_t.x);} catch(e) {alert('_t.x not defined');}

              _t.x ist nicht definiert, genausowenig wie this.x, da _t bzw. this aber ein Objekt ist, kannst du ohne Fehlermeldung auf this.irgendeinname zugreifen, ist aber hier undefiniert, wie die Meldung auch sagt.

              try {alert(_t.y);} catch(e) {alert('_t.y not defined');}

              _t.y oder this.y wurde deklariert und wird hier ausgegeben.

              <body onload="test()">

              Warum wartest du in diesem Beispiel auf das Laden des kompletten HTML Codes? Das wäre nicht nötig.

              Struppi.

              1. Hallo,

                OK, danke, ich hatte es eben aus dieser zeischrift so und sehe nun ein, dass es überflüssig ist. steht schon ganz weit oben auf meiner TODO-Liste, sowas wieder rückgängig zu machen. Danke aber trotzdem noch mal. Ich habs eben gerade noch mal mit FF 2.0.0.12 versucht, da hats nicht geklappt aber nach Lesen des Changelog einer späteren version (2.0.0.14) fand ich heraus, dass dies bei dem .12er ein Fehler war...

                mfg, Flo

                --
                sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                1. Ich habs eben gerade noch mal mit FF 2.0.0.12 versucht, da hats nicht geklappt aber nach Lesen des Changelog einer späteren version (2.0.0.14) fand ich heraus, dass dies bei dem .12er ein Fehler war...

                  Was war ein Fehler? Das was du da gemacht hast, ist seit Ewigkeiten ein normales Verhalten der Browser in JS. Ich kenne keinen Browser, der sich anders verhält.

                  Struppi.

                  1. Hallo,

                    Ich habs eben gerade noch mal mit FF 2.0.0.12 versucht, da hats nicht geklappt aber nach Lesen des Changelog einer späteren version (2.0.0.14) fand ich heraus, dass dies bei dem .12er ein Fehler war...

                    Was war ein Fehler? Das was du da gemacht hast, ist seit Ewigkeiten ein normales Verhalten der Browser in JS. Ich kenne keinen Browser, der sich anders verhält.

                    dass das mit this nicht ging, nur mit _t

                    mfg, Flo

                    --
                    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                    1. Ich habs eben gerade noch mal mit FF 2.0.0.12 versucht, da hats nicht geklappt aber nach Lesen des Changelog einer späteren version (2.0.0.14) fand ich heraus, dass dies bei dem .12er ein Fehler war...

                      Was war ein Fehler? Das was du da gemacht hast, ist seit Ewigkeiten ein normales Verhalten der Browser in JS. Ich kenne keinen Browser, der sich anders verhält.
                      dass das mit this nicht ging, nur mit _t

                      ich bin mir 100% sicher, dass Firefox in jeder Version mit this auf Eigenschaften des Objektes zugreifen kann. Das mit der lokalen Kopie ist nur nötig, wenn du eine Funktion in einem anderen Kontext aufrust, z.b. bei einem Event, aber das ist auch in jeder Version so.

                      Struppi.

                      1. Hallo,

                        Ich habs eben gerade noch mal mit FF 2.0.0.12 versucht, da hats nicht geklappt aber nach Lesen des Changelog einer späteren version (2.0.0.14) fand ich heraus, dass dies bei dem .12er ein Fehler war...

                        Was war ein Fehler? Das was du da gemacht hast, ist seit Ewigkeiten ein normales Verhalten der Browser in JS. Ich kenne keinen Browser, der sich anders verhält.
                        dass das mit this nicht ging, nur mit _t

                        ich bin mir 100% sicher, dass Firefox in jeder Version mit this auf Eigenschaften des Objektes zugreifen kann. Das mit der lokalen Kopie ist nur nötig, wenn du eine Funktion in einem anderen Kontext aufrust, z.b. bei einem Event, aber das ist auch in jeder Version so.

                        naja, jetzt hat sich ja alles geklärt :) also brauch man darüber nich mehr zu streiten, FF 2.0 is sowieso schnee von gestern

                        mfg, Flo

                        --
                        sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                        1. ich bin mir 100% sicher, dass Firefox in jeder Version mit this auf Eigenschaften des Objektes zugreifen kann. Das mit der lokalen Kopie ist nur nötig, wenn du eine Funktion in einem anderen Kontext aufrust, z.b. bei einem Event, aber das ist auch in jeder Version so.
                          naja, jetzt hat sich ja alles geklärt :) also brauch man darüber nich mehr zu streiten, FF 2.0 is sowieso schnee von gestern

                          Ich will mich auch nicht streiten, ich kann nur deine Aussage nicht nachvollziehen und bin mir 100% sicher das sie falsch ist. Dieses Verhalten war schon immer so und ich bezweifle, dass eine Unterversion eines neueren Browsers dies anders macht als z.b. der IE 3 oder Netscape 3

                          Struppi.

                          1. Hallo,

                            ich bin mir 100% sicher, dass Firefox in jeder Version mit this auf Eigenschaften des Objektes zugreifen kann. Das mit der lokalen Kopie ist nur nötig, wenn du eine Funktion in einem anderen Kontext aufrust, z.b. bei einem Event, aber das ist auch in jeder Version so.
                            naja, jetzt hat sich ja alles geklärt :) also brauch man darüber nich mehr zu streiten, FF 2.0 is sowieso schnee von gestern
                            Ich will mich auch nicht streiten, ich kann nur deine Aussage nicht nachvollziehen und bin mir 100% sicher das sie falsch ist. Dieses Verhalten war schon immer so und ich bezweifle, dass eine Unterversion eines neueren Browsers dies anders macht als z.b. der IE 3 oder Netscape 3

                            Doch, das kann ich mir schon vorstellen, wenn irgendwo was verändert wurde und nicht genug über die Konsquenzen nachgedacht wurde, kann sowas bei größeren Projekten schon der Fall sein :)

                            mfg, Flo

                            --
                            sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                            1. Doch, das kann ich mir schon vorstellen, wenn irgendwo was verändert wurde und nicht genug über die Konsquenzen nachgedacht wurde, kann sowas bei größeren Projekten schon der Fall sein :)

                              Nicht bei solchen grundsätzlichen Dingen. Ich bin mir auch sicher das der Code, den du uns gezeigt hast zu 100% wie erwartet in jeder FF Version abläuft.

                              Struppi.

                              1. Hallo,

                                Nicht bei solchen grundsätzlichen Dingen. Ich bin mir auch sicher das der Code, den du uns gezeigt hast zu 100% wie erwartet in jeder FF Version abläuft.

                                Is ja auch egal... Wir könnten hier noch 10x sagen "geht nicht" "geht 100%ig do-hoch", aber da wir aus dem kindergartenalter raus sind, lassen wir es besser. Obwohl ich denke, dass, weil es ja ein Bug war, auch da aufgetreten sein kann, denke mal an Murphy :) Diese FF-version gabs immerhin auch nur 2-3 Wochen

                                mfg, Flo

                                --
                                sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                                1. Nicht bei solchen grundsätzlichen Dingen. Ich bin mir auch sicher das der Code, den du uns gezeigt hast zu 100% wie erwartet in jeder FF Version abläuft.
                                  Is ja auch egal... Wir könnten hier noch 10x sagen "geht nicht" "geht 100%ig do-hoch", aber da wir aus dem kindergartenalter raus sind, lassen wir es besser. Obwohl ich denke, dass, weil es ja ein Bug war, auch da aufgetreten sein kann, denke mal an Murphy :) Diese FF-version gabs immerhin auch nur 2-3 Wochen

                                  Es ist nicht egal, wenn du etwas behauptest, was nicht ist. Das von dir beschriebene Verhalten wäre mir sicher aufgefallen, da ich viele Skripte im Einsatz habe, die soetwas nutzen und auch weder hier noch in anderen Foren ein Bug beklagt wurde der dieses Verhalten erklären würde.

                                  Da du die Technik offensichtlich nicht verstanden hattest, ist es wesentlich wahrscheinlicher, dass etwas falsch gemacht hast.

                                  Struppi.

                                  1. Hallo,

                                    Nicht bei solchen grundsätzlichen Dingen. Ich bin mir auch sicher das der Code, den du uns gezeigt hast zu 100% wie erwartet in jeder FF Version abläuft.
                                    Is ja auch egal... Wir könnten hier noch 10x sagen "geht nicht" "geht 100%ig do-hoch", aber da wir aus dem kindergartenalter raus sind, lassen wir es besser. Obwohl ich denke, dass, weil es ja ein Bug war, auch da aufgetreten sein kann, denke mal an Murphy :) Diese FF-version gabs immerhin auch nur 2-3 Wochen

                                    Es ist nicht egal, wenn du etwas behauptest, was nicht ist. Das von dir beschriebene Verhalten wäre mir sicher aufgefallen, da ich viele Skripte im Einsatz habe, die soetwas nutzen und auch weder hier noch in anderen Foren ein Bug beklagt wurde der dieses Verhalten erklären würde.

                                    Da du die Technik offensichtlich nicht verstanden hattest, ist es wesentlich wahrscheinlicher, dass etwas falsch gemacht hast.

                                    Ich habe die Technik verstanden! und mir ist es ja auch egal jetzt, ob das mit dem FF o war oder nicht.

                                    mfg, Flo

                                    --
                                    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
                                    1. Da du die Technik offensichtlich nicht verstanden hattest, ist es wesentlich wahrscheinlicher, dass etwas falsch gemacht hast.
                                      Ich habe die Technik verstanden! und mir ist es ja auch egal jetzt, ob das mit dem FF o war oder nicht.

                                      Mag sein dass du sie mittlerweile verstanden hast, aber als du uns das Beispiel gezeigt hast, hast du es nicht. Insofern nehme ich an, als die 0.12'er Version aktuell war, hattest du es auch nicht verstanden. Aber selbst wenn, du hast jetzt auch die Chance den "Bug" in der Version mal testen zu lassen, Timo hat die Version noch installiert. Dann würde sich die Frage endlich mal klären lassen.

                                      Struppi.

                2. OK, danke, ich hatte es eben aus dieser zeischrift so und sehe nun ein, dass es überflüssig ist. steht schon ganz weit oben auf meiner TODO-Liste, sowas wieder rückgängig zu machen. Danke aber trotzdem noch mal. Ich habs eben gerade noch mal mit FF 2.0.0.12 versucht, da hats nicht geklappt aber nach Lesen des Changelog einer späteren version (2.0.0.14) fand ich heraus, dass dies bei dem .12er ein Fehler war...

                  Ich habe hier den Firefox 2.0.0.12 und ich kann sowohl über direkt im Konstruktor definierte Methoden als auch nachträglich über prototypische Methoden auf this (und dessen Eigenschaften) zugreifen. Würdest du uns bitte ein Beispiel dafür liefern, wie es _nicht_ funktioniert hat?

                  --
                  Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                  Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
            2. Hallo levu,

              var _t = this;

              solche "Tricks" benötigst du eigentlich, wenn die Methoden in einem anderen Kontext laufen, z.B. bei Eventhandlern oder bei setTimeout. Mein Problem ist der Zugriff von prototypischen Erweiterungen aus auf private Variablen. Ich habe jetzt einfach im Konstruktor alle Variablen öffentlich gemacht, die in den Erweiterungen benötigt werden.

              Gruß, Jürgen

            3. Warum ist deine Beispielseite invalide? Kein Doctype, kein title-Element. Im Quirksmode können Browser signifikant anderes Verhalten aufweisen.

              (...)

              try {alert(_t.x);} catch(e) {alert('_t.x not defined');}
                try {alert(_t.y);} catch(e) {alert('_t.y not defined');}
              (...)

              Dir ist schon klar, dass diese catch-Blöcke nie ausgeführt werden, solange es sich bei \_t um ein Objekt handelt (was in diesem Fall so ist)?
              
              -- 
              Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.  
                
              Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:| 
              
              1. Hallo,

                Warum ist deine Beispielseite invalide? Kein Doctype, kein title-Element. Im Quirksmode können Browser signifikant anderes Verhalten aufweisen.

                (...)

                try {alert(_t.x);} catch(e) {alert('_t.x not defined');}
                  try {alert(_t.y);} catch(e) {alert('_t.y not defined');}
                (...)

                
                > Dir ist schon klar, dass diese catch-Blöcke nie ausgeführt werden, solange es sich bei \_t um ein Objekt handelt (was in diesem Fall so ist)?  
                
                Ich hab das extra gemacht, und hätte genausogut schreiben könne if(\_t.x) ... und ich wollte damit gucken, was geht und was nicht.  
                mfg, Flo
                
                -- 
                sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:| 
                
                1. (...)

                  try {alert(_t.x);} catch(e) {alert('_t.x not defined');}
                    try {alert(_t.y);} catch(e) {alert('_t.y not defined');}
                  (...)

                  
                  > > Dir ist schon klar, dass diese catch-Blöcke nie ausgeführt werden, solange es sich bei \_t um ein Objekt handelt (was in diesem Fall so ist)?  
                  > Ich hab das extra gemacht, und hätte genausogut schreiben könne if(\_t.x) ... und ich wollte damit gucken, was geht und was nicht.  
                  
                  Das wäre nicht dasselbe gewesen.  
                  ~~~javascript
                  try {alert(_t.x);} catch(e) {alert('_t.x not defined');}  
                  try {alert(_t.y);} catch(e) {alert('_t.y not defined');}
                  

                  liefert nacheinander die Meldungen "undefined" und "y",

                  if (_t.x){alert(_t.x);}else{alert('_t.x not defined');}  
                  if (_t.y){alert(_t.y);}else{alert('_t.y not defined');}
                  

                  hingegen "_t.x not defined", dann "y".
                  Noch kürzer (und in diesem Fall ausreichend) wäre allerdings:

                  alert(_t.x||'_t.x not defined');  
                  alert(_t.y||'_t.y not defined');
                  
                  --
                  Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                  Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
                  1. Hallo,

                    alert(_t.x||'_t.x not defined');

                    alert(_t.y||'_t.y not defined');

                    Jajaja, an diese Schreibweise wer ich mich noch gewöhnen müssen. Ich denk da nie dran :)  
                      
                    mfg, Flo
                    
                    -- 
                    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:| 
                    
        2. auf var-variablen kann ich so zugreifen, und auf this.-variblen nur mit _t (var _t = this)... naja, is ja auch egal.

          Es ist ein Rätsel worüber du sprichst.

          Variabeln die mit this deklariert sind öffentlich, d.h. von überall aus kannst du auf diese zugreifen. Auf Variabeln die du mit var im Konstruktor deklarierst, kannst du nur mit Funktionen, die du im Konstruktor dekalriert hast, zugreifen.

          Struppi.

          1. Hallo,

            Variabeln die mit this deklariert sind öffentlich,

            Ok, bei dem Beispiel, was ich eben gebracht habe, hab ich getestet, es ging auch mit this. Als ich das mit dem _t eingeführt hatte bei meinem Code hab ich das aus zwei gründen gemacht:

            1. Das stand so in einer Zeitschrift
            2. FF 2.0 hat es tatsächlich nicht mit this. geschluckt

            mfg, Flo

            --
            sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
            1. Variabeln die mit this deklariert sind öffentlich,
              Ok, bei dem Beispiel, was ich eben gebracht habe, hab ich getestet, es ging auch mit this. Als ich das mit dem _t eingeführt hatte bei meinem Code hab ich das aus zwei gründen gemacht:

              1. Das stand so in einer Zeitschrift

              was nicht unbedingt heißen muss, dass es richtig sind. Es gibt JS Zeitschriften, die gehören sofort auf den Müll.

              1. FF 2.0 hat es tatsächlich nicht mit this. geschluckt

              Das ist und bleibt falsch, zumindest in dem Kontext, den uns Jürgen gezeigt hat. D.h. du machst etwas komplett anders, wie du es auch zeigst

              Struppi.

            2. Als ich das mit dem _t eingeführt hatte bei meinem Code hab ich das aus zwei gründen gemacht:

              1. Das stand so in einer Zeitschrift

              Die Zeitschrift hat wahrscheinlich sogar Recht. Du hast sie nur höchstwahrscheinlich missverstanden und die Anwendungsbereiche verwechselt. Vielleicht liest du die Zeitschrift nochmal genau bzw. meinen Artikel, den ich dir empfohlen habe.

              Mathias

    2. Bei mir kann ich auf private zugreifen, aber ich muss noch var _t = this; machen, damit ich aus untermethoden _t.variable nutzen kann??

      Ja, wenn die Methoden in anderen Kontexten als die Instanz ausgeführt werden:
      http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#methoden-eigener-objekte-und-kontext

      Mathias

  3. Hallo,

    ich habe noch eine Frage: Welchen Vorteil bietet die prototypische Erweiterung gegenüber der dem direkten Notieren in der Funktion, also:

    var o = function() {  
      var p;  
    }  
    o.prototype.u = function() {  
      // ...  
    }
    

    gegenüber

    var o = function() {  
      var p;  
      this.u = function() {  
      // ...  
      }  
    }
    

    Einen Unterschied habe ich ja so eben kennengelernt, aber nicht unbedingt ein Vorteil. Prototypische Erweiterungen sollen weniger Speicher benötigen, da die Untermethoden ja nur einmal angelegt werden müssen. Außerden können Objekte ohne direkten Eingriff erweitert werden. Gibt es noch weitere Vorteile?

    Gruß, Jürgen

    1. Hallo,

      Gibt es noch weitere Vorteile?

      Die Lesbarkeit des Codes, nicht so viel verschachtelt => nicht so viele Einrückungen => komprimiert(er)

      mfg, Flo

      --
      sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
    2. Einen Unterschied habe ich ja so eben kennengelernt, aber nicht unbedingt ein Vorteil.

      Das hat auch nichts mit Vorteil zu tun, sondern ist eine Möglichkeit ein OOP Verhalten nachzubauen, da JS die Schlüsselwörter private, privileged nicht kennt. D.h. du hättest so die Möglichkeiten deine Objekte "sauberer" (im Sinne von OOP) zu deklarieren.

      Prototypische Erweiterungen sollen weniger Speicher benötigen, da die Untermethoden ja nur einmal angelegt werden müssen.

      Das ist ein Vorteil, kann aber auch wiederrum zum Nachteil werden, wenn du Objekte vererben willst.

      Struppi.