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 :
- 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 ;
- 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 ;
- 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);
}

