Académique Documents
Professionnel Documents
Culture Documents
Principes de POO
Une classe
Ref1=new TypeRefExemple();
Principes de POO
Les diffrentes fonctions membres (non exhaustif)
Mthode d'instance
A la diffrence des fonctions classiques l'appel de la mthode s'effectue
au travers d'un objet (instance d'une classe)
NomdeLobjet.NomdeLamethode
Exemple d'appel:
unMatou.EsperanceDeVie(poidsDuChat,ageActuel,race)
Mthode de classe
Prcde dans la dfinition de classe par l'attribut static
Elle s'appelle au travers de la classe elle-mme
Nomdelaclasse. NomdeLamethode
Les Constructeurs
Mthodes d'instances spciales invoques la cration de l'objet
Objectif: rpondre la question de l'initialisation de l'tat de l'objet
Principes de POO
Les Proprits (spcifiques au C#)
Mthodes d'instances spciales s'appuyant sur les accesseurs get/set
pour accder l'tat de l'objet
Objectifs
Respecter une encapsulation forte ( tous les champs restent privs)
Mettre en place un mcanisme d'accs souple 'simulant' un accs direct aux
champs
// exemple 1
public class Chat
{
uint _age; // par dfaut Private!!
public void Miauler()
{ Console.WriteLine("Miaouuu"); }
// Proprits :get/set
public uint AgeChat
{
get { return (_age; }
set {_age = value;}
}}
UnMatou.AgeChat=10;
Console.WriteLine("le matou a
" + UnMatou.AgeChat+" ans");
UnMatou.Miauler();
Elments de bases du C#
Les types NATIFS
Elments de bases du C#
Classification des variables
Variable de type valeur
Excepts les cas plus hauts (variables), tout le reste est rfrence
Le programmeur:
-Ne peut dcider son gr de la classification valeur ou rfrence
-Ne peut choisir directement lemplacement de stockage de ces
variables (heap ou stack ou register)
-Ne peut contrler directement la dure de vie ( des indications
peuvent cependant tre donnes au ramasse miette: notion de
finaliseur)
Elments de bases du C#
Illustration valeur versus rfrence
y est de type variable. Le contenu de la variable reflte
le contenu de la variable y
Exemple de code
struct TypeValExemple
{llustration type valeur versus rfrence
public int code_Apoge;
=10
public string nomEtudiant=toto;
}
class TypeRefExemple
{
;
public float note=10;
public string nomEtudiant=test;
}
TypeValExemple Etudiant1_TypeVal;
// forme 2 d'allocation
Classes
Une classe
Classes
Un Exemple
using System;
using ProjetChat;
{class Program
static void Main(string[] args)
{
Chat UnMatou;
UnMatou = new Chat();
UnMatou.Miauler();
UnMatou.DefAge(10);
Console.ReadKey();
}
}
Convention d'ecriture
int indiceTableau;
Champs de classe
Prfix par _
using System;
namespace ProjetChat
{
public class Chat
{
uint _age; // par dfaut Private!!
private uint _poids;
public void Miauler()
{ Console.WriteLine("Miaouuu"); }
public void DefAge(uint var)
{ this._age = var; }
}
}
Mthodes de classe
Classes
Les proprits et constructeurs
Voir poly , ci aprs un exemple
class Chat
{
// proprit automatique (private)
// avec avec acceseur public
//compatible C# 3
public ushort Age { get; set; }
public string Nom { get; set; }
// constructeurs
public Chat(ushort initialAge)
{
Age=initialAge;
Nom=noname;}
public Chat()
{
Age = 0; Nom=noname;}}
public Chat(ushort initialAge ,string nom)
{ Age = initialAge; this.Nom = nom; }
// destructeur (finalyser)
~Chat()
{Console.WriteLine("chat dtruit");}
// dfinition de la mthode Miauler
// renvoie : void
// paramtres : Aucun
// rle : imprime "Miaou" l'cran
public void Miauler()
{ Console.WriteLine("Miaou.."); }
class Program
// au moment de la cration le
// constructeur est automatiquement appel
Classes
Mthodes: passage de paramtres par valeur
Cration variable locale + copie de la valeur de l'objet transmis
Exemple : passage par valeur d'un type rfrence
class PassingRefByVal
Main, before calling the method, the first element is: {0}", arr [0]);
Main, after calling the method, the first element is: {0}", arr [0]);
Inside Main, before calling the method, the first element is: 1
Inside the method, the first element is: -3
Inside Main, after calling the method, the first element is: 888
Classes
Mthodes: passage de paramtres par rfrence
Cration variable locale de type rfrence
copie de la rfrence de l'objet transmis
Obtenu par le mots clef : ref
Exemple : passage par rfrence d'un type rfrence
class PassingRefByRef
{
static void Change(ref int[] pArray)
{
// Both of the following changes will affect the original variables:
pArray[0] = 888;
pArray = new int[5] {-3, -1, -2, -3, -4};
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
}
Les gnriques
Un objectif: production des tructures informatiques gnriques
rutilisatisables pour diffrents types d'objets
Exemple typique: les conteneurs d'objets
Listes, piles
Application
// cration du dictionnaire
Dictionary<UInt32,Etudiant> dicLPSE=new Dictionary<UInt32,Etudiant> ();
// Methode 1:parcours du dictionnaire pour chaque couple cle/valeur
// ajout des entrees
dicLPSE.Add(100213,new Etudiant("Oscar","Amel",21,100213));
Dlgations et dlgus
Objectif: Cration d'objets se comportant comme une fonction
Notion de Foncteur que l'on retrouve en C++
Connexes aux pointeurs de fonctions
Une dlagation
Le dlgu
Dlgations et dlgus
Exemples
using System;
class Program
{
static double f(int n) {return n/2.0;}
static double g(int n) {return n*2;}
delegate double T(int n); // dlgation
static void Main()
{
T de; // dclaration de variable
de = new T(f); // de fait rfrence f
double d = de(5); // excution de f, d prenant la valeur 2.5
de = new T(g); // de fait maintenant rfrence g
d = de(100); // excution de g, d prenant la valeur 200}}
using System;
class A
{
public void f() {Console.WriteLine("Fonction f de A");}
public void g() {Console.WriteLine("Fonction g de A");}
public delegate void T(); // dfinition de type dlgu
}
class Program
{
static void Main()
{A a = new A();
A.T de = new A.T(a.f);
de(); // excution de f de A
de = new A.T(a.g);
de(); // excution de g de A}
Transformer valeur, comparer 2 valeurs entre elles, valeur correspond critre oui/non
namespace System{
public delegate
public delegate
public delegate
public delegate
.......
}
Dlgations et dlgus
Mise en application
Comprendre les prototypes dans msdn
Problmatique: je veux trier une liste suivants mes propres critres
Rsultat de ma recherche sur la classe List<T>
public void Sort( Comparison<T> comparison )
Dlgations et dlgus
Et le code?
class Program
{
class Rectangle
static void Main(string[] args)
{
{
private uint _aire;
List<Rectangle> maList = new List<Rectangle>();
public uint Longueur {get; set;}
maList.Add(new Rectangle(10, 20));
public uint Largeur {get; set;}
maList.Add(new Rectangle(10, 10));
public uint Aire { get { return (_aire); } }
maList.Add(new Rectangle(1, 2));
public Rectangle(uint longueur, uint largeur)
maList.Add(new Rectangle(20, 10));
{
// Le dlgu Comparison pointera vers Rectangle.CompareRectangle
Longueur = longueur;
// lors du tri Sort appelera au travers du dlgu ma fonction de comparaison!
Largeur = largeur;
maList.Sort(Rectangle.CompareRectangle);
_aire = Longueur * Largeur;
foreach (Rectangle rect in maList) Console.WriteLine(rect);
}
// exemple de methode anonyme ( delgu sur methode non nomme)
public static int CompareRectangle(Rectangle r1, Rectangle r2)
maList.Sort(
{
int valcomp=r1.Aire.CompareTo(r2.Aire);
delegate(Rectangle r1,Rectangle r2)
if (valcomp==0)
{return(r1.Aire.CompareTo(r2.Aire)); }
if (r1.Longueur>r2.Longueur) valcomp=1;
);
return valcomp;
// mme exemple avec expression lambda
}
maList.Sort((r1, r2) => r1.Aire.CompareTo(r2.Aire));
public override string ToString()
foreach (Rectangle rect in maList) Console.WriteLine(rect);
{
Console.ReadKey();
return ("Long:"+Longueur+" larg:"+Largeur+" Aire:"+Aire);
}
}
}
}
Remarque: Il est possible daborder le problme par le biais des Interfaces (voir chapitre
hritage p55/56)
public void Sort(IComparer<T> comparer)
Mthodes d'extensions
Objectif: permet dajouter des mthodes des classes dont nne
dispose pas du code source et/ou qui sont qualifies de sealed
Pas de modification du type d'origine
Elle sont un type particulier de mthodes statiques
La syntaxe: public static zzzz NOMMETHODE( this,xx,yy)
static class SupDateTime
{
public static bool Antrieur(this DateTime d)
{
return d < DateTime.Now;
}
}
......
DateTime dt = new DateTime(1789, 7, 14);
bool res = dt.Anterieur();
dt.Anterieur(
SupDateTime.Anterieur(dt,
);
);
Mthodes d'extensions
Application
Je cherche effectuer la moyenne des aires de mes rectangles
Que dis MSDN?
Mthode statique sappliquant sur un
IEnumerable de type gnrique
Tsource (Tsource=Rectangle pour nous)
Renvoie un double
public static double Average<TSource>(
this IEnumerable<TSource> source,
Func<TSource, long> selector
)
La mthode cible
Mise
class Rectangle
respecte le contrat
{
OK
en oeuvre
Comment a marche?
Hritage
Voir votre cours de Java: notion identique
};
// specialisation
// new est optionnel => evite warning compilateur
//new prcise l'intention du concepteur de spcialiser la mthode
public new void Crier() { Console.WriteLine("Ouarfff"); }
Polymorphisme
Convertion de type UpCast
Rponse: il est utile de regrouper au sein d'un conteneur (une liste par exemple)
des objets diffrents et de leur appliquer un traitement commun
Exemple: une liste de diffrents mammifres, la liste est balaye pour les faire crier
Polymorphisme
Le couple virtual/override
L'objectif est de pouvoir appeler la mthode de substitution
adquate partir d'une rfrence de base pointant vers des objets de
type classe drive
public class Mammifere
{
//methodes
public virtual void Crier() { Console.WriteLine("Raaaa"); }
public virtual void Sous_Ordre_Especes() { Console.WriteLine("Mammifere"); }
public void NbreDePattes() { Console.WriteLine("Inconnu"); }
}
class Chien : Mammifere
{
public override void Crier() { Console.WriteLine("Ouarfff"); }
public void Sous_Ordre_Especes() { Console.WriteLine("Canids"); }
public void NbreDePattes() { Console.WriteLine("Chien: 4 pattes"); }
};
class Chat : Mammifere
{
public override void Crier() { Console.WriteLine("Miaouu"); }
public override void Sous_Ordre_Especes() { Console.WriteLine("Flids"); }
public void NbreDePattes() { Console.WriteLine("Chat: 4 pattes"); }
};
Miaouu
Flids
Inconnu
Polymorphisme
Permet d'effectuer une action sera slectionne contextuellement
en fonction de la classe d'objets laquelle elle s'applique
Elle s'appuie sur la convertion UpCast
Sur le couple virtual/override
Miaouu
Ouarfff
Raaaa
Classe abstraite
Une classe est dite abstraite lorsque le prfixe abstract est rajout devant
le mot cl class :
Une classe abstraite permet de dclarer des membres abstraits
Methodes ou champs prcds aussi par abstract
=> sans corps de fonction
peut tre utilise uniquement si une classe nouvelle est drive d'elle
Interfaces
Concepts
Une interface peut tre vue donc comme un modle de classe qui contient les
prototypes des mthodes et des proprits
aucune dfinition de corps: tous les lments sont abstraits
Chaque classe qui choisira d'implmenter l'interface devra respecter le contrat impos
et fournir une implmentation de l'interface (ie fournir le code des mthodes
Une classe peut implmenter plusieurs interfaces
Les interfaces sont polymorphes
pour des fonctionnalits connexes qui peuvent appartenir n'importe quelle classe
Si la fonctionnalit que vous crez est utile de nombreux objets diffrents
Les interfaces sont plutt petites et indpendantes les unes des autres.
Interfaces
Un exemple
//Fonction Vole
interface IVolant
{void Vole();}
// Fonction a des pattes
interface IPatte
{
// dfinition d'une proprit en lecture
int NbPatte { get; }
}
// classe de base
public class Mammifere
{
//methodes communes tous les mammifres
public virtual void Crier() { C
onsole.WriteLine("Raaaa"); }
public virtual void Sous_Ordre_Especes() {
Console.WriteLine("Mammifere"); }
}
Interfaces
Un exemple
Utilisation des classes cres
ChauveSouris uneChauveSouris = new ChauveSouris();
uneChauveSouris.Vole();
// On regroupe tout le monde sous le type de base
List<Mammifere> maMenagerie = new List<Mammifere>();
// Je peuple la mnagerie
maMenagerie.Add(new ChauveSouris());
maMenagerie.Add(new Baleine());
maMenagerie.Add(new ChauveSouris());
maMenagerie.Add(new Chien());
//Qui vole dans ma mnagerie????
foreach (Mammifere mam in maMenagerie)
{
if (mam is IVolant)
((IVolant)mam).Vole();
else
Console.WriteLine("Non Volant");
}
//Allez tous le monde crie
foreach (Mammifere mam in maMenagerie)
mam.Crier(); // triatement de base crier =>polymorphisme
Interfaces
Interfaces utiles du framework .NET
List<Temperature> temps =
new List<Temperature>();
temps.Add(new Temperature(2017.15,1000));
temps.Add(new Temperature(0,100));
temps.Add(new Temperature(50,50));
foreach (Temperature t in temps)
if (t.Equals(temps[1]))
Console.WriteLine("temprature moyenne gale");
else
Console.WriteLine("temprature moyenne diffrente");