Faculté I&C, Claude Petitpierre, André Maurer 1 Concepts dhéritage Héritage dimplémentation hasA Héritage de spécialisation isA
Faculté I&C, Claude Petitpierre, André Maurer 2 Héritage Javascript, rappel function Translation() { this.tPrint = function() { ctx.save() ctx.translate(this.xt,this.yt) this.print() ctx.restore() } this.initTranslation = function(xt,yt) { this.xt = xt this.yt = yt // définition des attributs } } function Cercle(x,y,r,xt,yt) { this.initTranslation(xt,yt) this.print = function() { ctx.beginPath() ctx.arc(x,y,r,0,2*Math.PI,true) ctx.stroke() } }... Cercle.prototype = new Translation() function execute() { var cercle1 = new Cercle(50,50,15,0,0) cercle1.tPrint() var cercle2 = new Cercle(50,55,15,90,90) cercle2.tPrint() }
Faculté I&C, Claude Petitpierre, André Maurer 3 Héritage en général 3 Héritage de spécialisation isA Un cercle estUn élément graphique Base pour Java (langage typé) Héritage dimplémentation hasA Un cercle aUn un transformateur Base pour Javascript Si le cercle estUn élément graphique, il aUne méthode dessiner() Si le cercle aUn opérateur de transformation, il estUn élément de lensemble des objets (classe) qui possèdent un tel opérateur.5
Faculté I&C, Claude Petitpierre, André Maurer 4 Constructeur en Javascript function Cercle(nom) { this.nom = nom this.dessiner = function() { document.write(this.nom) } }... c = new Cercle("cer") c.dessiner()
Faculté I&C, Claude Petitpierre, André Maurer 5 5 class Cercle { // enveloppe String nom; Cercle(String nom) { // constructeur this.nom = nom; } void dessiner(){ System.out.println(nom); ou } Cercle(String _nom) { }nom = _nom;... } Cercle c = new Cercle("cer"); c.dessiner(); Constructeur en Java
Faculté I&C, Claude Petitpierre, André Maurer 6 Mise en commun dobjets Javascript var els = [ ] els[0] = new Cercle("cer1") els[0].dessiner() els[1] = new Rectangle("rec1") els[1].dessiner() Java Cercle[ ] els = new Cercle [12]; els[0] = new Cercle("cer1"); els[0].dessiner(); els[1] = new Rectangle("rec1"); els[1].dessiner(); On suppose quon veut mettre différents types dobjets dans un même tableau pour les afficher en appelant leur fonction dessiner. Il faut donc quils aient (aUne) tous la fonction dessiner.
Faculté I&C, Claude Petitpierre, André Maurer 7 7 class ElementGraphique { // un ElementGraphique aUne fonction dessiner void dessiner() { } // à redéfinir } class Cercle extends ElementGraphique { // estUn ElementGraphique void dessiner(){ // redéfinition de dessiner System.out.println(nom); } ElementGraphique[ ] els = new ElementGraphique [12]; els[0] = new Cercle("cer1"); els[1] = new Rectangle("rec1"); els[0].dessiner(); els[1].dessiner(); Solution (Java)
Faculté I&C, Claude Petitpierre, André Maurer 8 Comparaison Java - Javascript En Java on définit explicitement la relation estUn. Un ElementGraphique crée un objet qui aUne fonction dessiner() et le compilateur peut ainsi assurer que les instructions quil compile nappellent que des objets de la bonne classe. En Javascript, la relation estUn est gratuite, mais si lon appelle une méthode qui na pas été définie dans un objet, le programme sarrête au moment où il appelle cette fonction.
Faculté I&C, Claude Petitpierre, André Maurer 9 Polymorphisme aUn suffit en Javascript estUn assure aUn en Java
Faculté I&C, Claude Petitpierre, André Maurer 10 Adjonction dun opérateur (aUne) On veut définir une nouvelle fonction qui dessine le nom dans une balise Java public class ElementGraphique { void nDessiner() { System.out.print(" "); dessiner(); System.out.println(" "); } void dessiner() { } // ajouté à la classe existante // héritage déjà fait par extends Javascript function Transform() { this.nDessiner = function() { document.write(" ") this.dessiner() document.write(" ") } } Cercle.prototype = new Transform()
Faculté I&C, Claude Petitpierre, André Maurer 11 Héritage multiple (en cascade) class Transformation {} class ElementGraphique extends Transformation { } class Cercle extends ElementGraphique { } function Transformation() { } ElementGraphique.prototype = new Transformation() function ElementGraphique() { } Cercle.prototype = new ElementGraphique() function Cercle(nom) { }
Faculté I&C, Claude Petitpierre, André Maurer 12 Harmonisation des noms, Attribut nom déplacé dans la super-classe class ElementGraphique { String nom; ElementGraphique(String nom) { this.nom = nom; } void dessiner() { } void nDessiner() {... } } class Cercle extends ElementGraphique { Cercle(String nom) { super(nom); } void dessiner(){ System.out.println(nom); } function ElementGraphique() { this.init = function(nom) { this.nom = nom } this.nDessiner = function() {... } } function Cercle(nom) { this.init(nom) this.dessiner = function() { document.write(this.nom) } }