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