On distingue 3 niveaux de protection opérant sur les propriétés et méthodes d'une classe:
public : les propriétés et méthodes public sont accessibles par n'importe qui,
protected : les propriétés et méthodes "protected" sont accessibles depuis les méthodes de la classe ainsi que depuis les méthodes des classes descendantes. Descendant: classe dérivée, classe fille classe qui hérite de ...
private : les propriétés et méthodes privées ne sont accessibles que par les méthodes de la classe elle-même.
Exemple: encapsulation de la classe compte
class compte
{
private:
int no;
double solde;
public:
compte(int n, double sommeInitiale)
{
no=n;
solde=sommeInitiale;
}
double getSolde()
{
return solde;
}
void debiter(double debit)
{
solde-=debit;
}
void crediter(double credit)
{
solde+=credit;
}
};
On donne l'instruction suivante :
void main(void)
{
compte * cpt1= new compte(1,100);
cout <<"compte n°"<<cpt1->no<<" solde: "<<cpt1->solde<<"\n";
}
L'instruction ci-dessus provoque deux erreurs pourquoi ?
Modifiez le code de la classe "compte" et éventuellement du "main" de façon à obtenir le numéro et le solde.
Il est possible d'implémenter les méthodes en dehors de l'interface de la classe. On utilise pour cela l'opérateur de résolution de portée "::".
class compte
{
private:
int no;
double solde;
public:
compte(int n, double sommeInitiale)
{
no=n;
solde=sommeInitiale;
}
double getSolde()
{
return solde;
}
void debiter(double debit)
{
solde-=debit;
}
void crediter(double credit)
{
solde+=credit;
}
void affiche();
};
void compte::affiche() //implémentation de la méthode affiche de la classe compte en dehors de l'interface
{
}
Nous verrons ici comment résoudre un problème de gestion à l'aide de la POO. cas: gestion des températures de différentes villes et statistiques. Pour chaque ville et chaque mois de l'année, on disposera de la température moyenne observée. L'application nous permettra d'effectuer la saisie des températures des différentes villes, elle nous affichera ensuite: la ville la plus froide , la ville la plus chaude, la ville qui subit l'amplitude la plus forte chaque affichage sera constitué du nom de la ville et du chiffre demandé exprimé en degrès (celsius). On propose la liste de classe suivante: ville région application
L'héritage permet de dériver une classe à partir d'une classe de base. La classe dérivée possède alors les capacités de la classe de base.
Ainsi, on peut définir une classe produit périssable à partir de la classe produit. La classe produit périssable hérite de la classe produit, un produit périssable est un produit.En plus des propriétés et méthodes héritées de la classe produit, produit périssable possède des propriétés et méthodes qui lui sont propres comme par exemple la date de péremption.
On appelle aussi cette structure généralisation, spécialisation: la classe produit périssable est une spécialisation de la classe générique produit.
Représentation de l'héritage entre classes avec le formalisme uml:
Exercice: Retrouvez les différentes structures héritage dans l'ensemble de classes suivant: {employé, voiture, table, camion, client professionnel,vendeur, table basse,compte rémunéré,client,véhicule,banquette,compte courant,vélo,particulier,compte,meuble,table de cuisine,compte bancaire,client particulier,chauffeur}
Héritage simple syntaxe:
class fille :public mere //la classe fille hérite de la classe mère.
{
};
//Exemple d'héritage:
class compte
{
private:
int numero;
double solde;
public:
compte(int num ,double sommeInitiale);
crediter(double somme);
debiter(double somme);
double solde();
};
class compteRemunere: public compte
{
private:
double tauxInteret;
public:
void ajoutInteret();
comteRemunere(int n, double v, double t): compte(n,v) //le constructeur appelle le constructeur de la classe mère
{
tauxInteret=t; //et réalise son propre code
}
};
La classe string est trés interessante, elle a toutefois quelques lacunes qu'on aimerait bien combler. Nous aimerions bien disposer d'une classe string qui soit dotée des capacités supplémentaires suivantes:
Indications: pour réaliser ce travail vous aurez besoin de travailler sur l'instance dont on appelle la méthode. this est un pointeur sur l'instance en cours d'exécution, il contient donc l'adresse mémoire de la première case de la mémoire vive ou est stockée l'instance en cours d'exécution. *this représente donc l'instance en elle-même. Si vous avez besoin de travailler sur l'instance en tant que string vous devez caster * this. exemple: string contenuActuel=(string) *this; vous permet de récupérer ce qu'il y a dans l'instance en cours (prise en tant que string et non gapString c'est possible car on a défini la gapString comme étant une string mais disposant de fonctionnalités supplémentaires.
Voici un extrait de l'interface de la classe gapString. Réalisez l'implémentation de la classe gapString.
class gapString : public string
{
private:
bool echec;
public:
bool fail(); //renvoie faux si le dernier toLong ou toDouble s'est mal passé
//en pratique renvoie la valeur de echec
double toDouble(); //essaie de construire et renvoyer un double à partir de son contenu
//si ça se passe mal met true dans echec sinon met false
bool isDouble();
long toLong();
bool isLong();
vector <string> split(char);
bool implode(vector <string>,char);
gapString (double);
gapString(long);
gapString(int);
gapString(string);
gapString();
gapString toLower();
gapString toUpper();
bool empty();
bool isNumber();
};
Une entreprise de livraison souhaite gérer son parc de véhicule. Elle dispose de véhicules motorisés ou non, immatriculés ou non, des deux roues, des camions des voitures, des vélos, des motos. En fonction du véhicule , divers renseignements devront être enregistrés: date d'achat, nombre de kilomètres au compteur, nombre d'essieux, numéro d'immatriculation, cylindrée, nombre de roues, nombre de vitesses, PTAC, date de première mise en circulation, volume de chargement, marque, modèle, couleur etc... . Aprés avoir conçu à l'aide d'umbrello la hiérarchie de classes répondant au problème de gestion de l'entreprise, implémentez les méthodes de saisie et d'affichage des différentes classes. Instanciez un parc de véhicule vous permettant de tester votre programme.
Remarque : Appel de méthodes de la classe mère dans les méthodes de la classe fille.
Si la classe mère dispose d'une méthode "affiche", dans la classe fille, on appelle cette méthode en la préfixant par le nom de la classe mère suivi de l'opérateur de résolution de portée "::", exemple :
vehicule::affiche();
l'instruction ci-dessus appelle la méthode affiche de la classe mère sur l'instance en cours.