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.

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>