IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Programmation orientée objet par prototype avec jQuery


précédentsommairesuivant

IV. Rendre une « fonction classe » poopj abstraite

On peut rendre une « fonction classe » non instanciable en passant l'option _abstract à true.

L'option _abstract
Sélectionnez
try {
  var funcClass = $.dvjhClass._create( {
     
    // contenu du premier objet anonyme
        
  },
  {

    /*
     * contenu du second objet anonyme
     * 
     * $.dvjhClass définit les options : _abstract, 
     * _auteur, _copyright,  et _version 
     * mais il n'utilise que la première. 
     * Vous pouvez modifier les autres à votre 
     * convenance et en utiliser d'autres.
     */
    
    _abstract: true
        
  } );
}
catch(err){
    alert(err);
}

Cette possibilité ne doit pas être négligée :

  1. On peut écrire une « fonction classe » abstraite, c'est-à-dire une « fonction classe » qui n'implémente pas toutes les méthodes qui sont nécessaires à son fonctionnement. C'est la « fonction classe » fille (la classe qui hérite) qui a la responsabilité de fournir l'implémentation des méthodes manquantes ;
  2. On peut écrire l'équivalent d'une interface en écrivant une « fonction classe » abstraite qui ne contient qu'un squelette, c'est-à-dire des attributs non initialisés et des méthodes non implémentées ;
  3. On peut écrire l'équivalent d'une « fonction classe » Math, c'est-à-dire une « fonction classe » non instanciable et constituée entièrement d'attributs et de méthodes statiques.
Une fonction classe abstraite (poopj4.html)
Sélectionnez
try {
  var Personne = $.dvjhClass._create({
    _builder: function(prenom, nom){
        this.prenom = prenom || "";
        this.nom = nom || "";
        
        /*
         * On doit enregistrer l'adresse de chaque
         * instance de la fonction classe Personne.
         *
         *, Mais on délègue cette responsabilité à
         * la classe qui héritera de celle-ci.
         */
        this.adresse = ""; // valeur non disponible
    },
    getAdresse: function(){
        return this.adresse;  // valeur non disponible
    },
    setAdresse: function(value){
        // implémentation non disponible
    },
    toString: function(){
        return "Personne : ";
    }
  },
  {
    _abstract: true
    
  });

  /*
   * Dans le cas d'une classe abstraite on choisit de
   * retourner un objet vide (new Object) plutôt que
   * de déclencher une exception, car dans ce cas
   * l'opérateur new construit un objet invalide.
   */
  var dvjh = new Personne("Daniel", "Hagnoul");

  console.log(typeof dvjh, dvjh);
}
catch(err){
  alert(err);
}
Une fonction classe interface
Sélectionnez
try {
  var IEtudiant = $.dvjhClass._create({
    _builder: function(prenom, nom, adresse, numero, 
                       classe, interne){
        this.prenom = "";
        this.nom = "";
        this.adresse = "";
        this.numero = "";
        this.classe = "";
        this.interne = "";
    },
    getPrenom: function(){},
    getNom: function(){},
    getAdresse: function(){},
    getNumero: function(){},
    getClasse: function(){},
    getInterne: function(){},
    setPrenom: function(value){},
    setNom: function(value){},
    setAdresse: function(value){},
    setNumero: function(value){},
    setClasse: function(value){},
    setInterne: function(value){},
    toString: function(){
        return "IEtudiant : ";
    }
  },
  {
    _abstract: true
  });
}
catch(err){
  alert(err);
}
Une fonction classe statique
Sélectionnez
try {
  var PIERRE = $.dvjhClass._create({
    _builder: function(){
        // même vide, le constructeur doit toujours exister
    },
    toString: function(){
        return "PIERRE : ";
    }
  },
  {
    _abstract: true
  });

  PIERRE.prenom = "Pierre";
  PIERRE.nom = "Dupond";
  PIERRE.rue = "27 Rue de la Joie";
  PIERRE.ville = "Tristesseville";
  PIERRE.fonction = "Directeur exécutif";
  PIERRE.telephone = "+32 844 256 612";
  PIERRE.email = "direction@supertrust.com";
  PIERRE.vacances = function(date){
    // retourne true si PIERRE est en vacances à cette date
    return AgendaPierre("vacances", date);
  };
  PIERRE.rendezvous = function(type, visiteurs, date){
    // retourne true si PIERRE accepte ce rendez-vous
    return AgendaPierre(type, visiteurs, date);
  }

  console.log(PIERRE, PIERRE.prototype);
}
catch(err){
  alert(err);
}

précédentsommairesuivant