Objektorientierung in JavaScript/Datenkapselung, Vererbung, Polymorphie/Polymorphie

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Javascript</language>
==Was ist Polymorphie?==
Einer Variablen können in Programmiersprachen, die (dynamische) Polymorphie unterstützen, nicht nur ein Objekt einer Klasse, sondern auch Objekte aller Unterklassen zugewiesen werden. Dieses Merkmal der Objektorientierung ist in einer dynamisch typisierten Programmiersprache wie JavaScript natürlich nicht sehr deutlich erkennbar, denn hier kann eine Variable prinzipiell jedes Typs sein.
Deutlich sichtbar ist aber das ''dynamische Binden'': Wird eine Methode eines Objekts aufgerufen, wird erst zur Laufzeit entschieden, welche konkrete Implementierung ausgeführt wird - die Implementierung in der Basis- oder der Unterklasse.
<code id="5427192703042016">
function Alfred() {
  this.meinName = function() {
    return "Ich bin Alfred.";
  }
}
function Berta() {
  this.meinName = function() {
    return "Ich bin Berta.";
  }
}
function Caroline() {
  this.meinName = function() {
    return "Ich bin Caroline.";
  }
}

function entscheideDich(taste) {
  var polymorphesObjekt;
  switch(taste.toUpperCase()) {
    case "A": 
      polymorphesObjekt = new Alfred();
      break;
    case "B":
      polymorphesObjekt = new Berta();
      break;
    case "C":
      polymorphesObjekt = new Caroline();
      break;
    default:
      return "Dieser Buchstabe kann nicht angegeben werden.";
  };
  return polymorphesObjekt.meinName();
}
</code>
Teste diese Funktion mit den Buchstaben "A", "B" und "C".
<run id="5427192aa993942016">
entscheideDich("A");
</run>
Es werden bei verändertem Buchstaben unterschiedliche Ergebnisse zurückgegeben.

==Überschreiben von Methoden==
Eine erbende Klasse hat die Möglichkeit, die Methoden der Basisklasse zu ''überschreiben''.
<code id="5427194003042016a">
function Mensch() {
   this.meinName = function() {
    return "Ich habe noch keinen Namen.";
  }
}
function Daniel() {}
Alfred.prototype = new Mensch();
Berta.prototype = new Mensch();
Caroline.prototype = new Mensch();
Daniel.prototype = new Mensch();
</code>
Bei der Klasse <tt>Daniel</tt> wurde die Methode <tt>meinName()</tt> nicht überschrieben, während die anderen drei Klassen diese selbst implementieren.
<run id="5427194403042016h">
var alfred = new Alfred();
var daniel = new Daniel();
alfred.meinName() + "\n" + daniel.meinName();
</run>
<tt>daniel</tt> ruft die Methode der Basisklasse <tt>Mensch</tt> auf.
<run id="5426194803042016">
var caro = new Caroline();
var daniel = new Daniel();
caro.hasOwnProperty("meinName") + "\n" + daniel.hasOwnProperty("meinName");
</run>

==Aufgaben==
Gegeben sind folgende Klassen:
<code id="054104042016">
function KlasseA() {
  this.operation = function() {
    return "Operation der KlasseA";
  }
}
function KlasseB() {
  this.operation = function() {
    return "Operation der KlasseB";
  }
}
function KlasseC() {}
function KlasseD() {
  this.operation = function() {
    return "Operation der KlasseD";
  }
}
function KlasseE() {}
function KlasseF() {}
function KlasseG() {
  this.operation = function() {
    return "Operation der KlasseG";
  }
}
function KlasseH() {}
KlasseA.prototype = new KlasseB();
KlasseD.prototype = new KlasseB();
KlasseE.prototype = new KlasseB();
KlasseF.prototype = new KlasseE();
KlasseG.prototype = new KlasseA();
KlasseH.prototype = new KlasseG();</code>
<ol>
<li>Geben Sie an:
<pre>
new KlasseA().operation();
new KlasseB().operation();
new KlasseC().operation();
new KlasseD().operation();
new KlasseE().operation();
new KlasseF().operation();
new KlasseG().operation();
new KlasseH().operation();
</pre>
</ol>
<run id="4c83537c2e9a0">new KlasseA().operation();
</run>