Vous êtes sur la page 1sur 28

C# Synthse

Les points clefs

Principes de POO
Une classe

Permet au concepteur de dfinir un nouveau type d'objet


Elle est constitue schmatiquement de:
class TypeRefExemple
Donnes membres -> tat de l'objet
Fonctions membres -> traitement des donnes

Mot cl: class

public float note;


public string nomEtudiant;
}

Instance d'une classe

Appel aussi objet (ou instance de la classe)


Est une ralisation particulire d'un type donne

Ref1=new TypeRefExemple();

Ex: Un 'objet' Labrador est une instance de la classe d'objet Chien

Chaque objet possde son propre tat independamment des autres


Possibilit cependant de 'partager ' une donne grce static

Les donnes membres

Appelles aussi champs de la classe


Sont encapsules dans la classe
Champs privs (private )

la donne est inacessible depuis l'extrieur de la classe


Seule les fonctions membres ont un accs

Champs public (public )

Accessible de partout ( dangeureux!!!!!)

public class Chat


{
private uint _age;
public void Age (void)
{Console.WriteLine(Age);}
}
.
Chat unMatou= new Chat();
unMatou._age=10;//INTERDIT
unMatou.Age(); //methode OK

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

Ne ncessite donc pas l'instantiation d'une classe


Ex: La classe Console (qui est aussi static) dfinit la mthode statique
WriteLine ex:Console.WriteLine("coucou")

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

// exemple 2 avec proprits auto


public class Chat
{

//MISE EN OEUVRE CLASSE


//CHAT
Chat UnMatou= new Chat();

public void Miauler()


{ Console.WriteLine("Miaouuu"); }
// Proprits Automatique
public uint AgeChat
{
get ;set;
}
}

UnMatou.AgeChat=10;
Console.WriteLine("le matou a
" + UnMatou.AgeChat+" ans");
UnMatou.Miauler();

Elments de bases du C#
Les types NATIFS

Le pige du type CHAR

Codage Unicode des caractres (2 octets!!!)

Organisation en 17 pages contenant 65536 codes possibles(1Mga codes possibles!)


La page 0 est appele " Basic Multilingual Plane" permettant de coder tous les langages
modernes

Utilisez la police Lucida raster pour votre fenetre console


Abandonnez de manire gnrale les tableaux de char au profit de la classe
string
Char [] machaine mieux string maChaine; ou stringBuilder maChaine;

Elments de bases du C#
Classification des variables
Variable de type valeur

La variable contient la valeur de la donne


Les types prdfinis, les structures et les enum sont de type valeur
Ex: int mavariable=100;

Variable de type rfrence

La variable de type rfrence stocke une rfrence aux donnes


principe d'indirection (analogie pointeurs voir p6 poly)

Une rfrence tablit "un lien" vers lobjet vis


une rfrence n'est pas obligatoirement l'adresse de l'objet rfrenc

cependant les concepteurs du C# ont opt pour cette option technologique

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

x est de type rfrence. Le contenu de la variable contient


"un lien" vers la donne situ ailleurs en mmoire.

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

// creation de deux variables du type TypeValExemple


// forme 1

TypeValExemple Etudiant1_TypeVal;
// forme 2 d'allocation

TypeValExemple Etudiant2_TypeVal=new TypeValExemple();


// copie DES VALEURS
Etudiant1_TypeVal =Etudiant2_TypeVal;

// rfrence non initialise


TypeRefExemple Etudiant3_TypeRef1
// fait rfrence au

nouvel objet cre par l'oprarateur new

TypeRefExemple Etudiant3_TypeRef2=new TypeRefExemple();


// copie DES REFERENCES (copie par valeurs des rfrences et non des donnes)
Etudiant3_TypeRef1=Etudiant3_TypeRef;

Classes
Une classe

Permet au concepteur de dfinir un nouveau type d'objet


Elle est constitue schmatiquement de:
Donnes membres -> tat de l'objet
Fonctions membres -> traitement des donnes

Mot cl: class

Instance d'une classe

Appel aussi objet (ou instance de la classe)


Est une ralisation particulire d'un type donne

Ex: Un 'objet' Labrador est une instance de la classe d'objet Chien

Chaque objet possde son propre tat independamment des autres


Possibilt cependant de 'partager ' une donne grce static

Les donnes membres

Appelles aussi champs de la classe


Sont encapsules dans la classe
Champs privs (private )

la donne est inacessible depuis l'extrieur de la classe


Seule les fonctions membres ont un accs

Champs public (public )

Accessible de partout ( dangeureux!!!!!)

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

Vos variables (si hors classes)

1re lettre en minuscule (convention camel case)

int indiceTableau;

Champs de classe
Prfix par _

private uint _poids;

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

this, qui est un mot rserv du C#,


dsigne lobjet sur lequel opre la
mthode. this est utilisable
dans toutes les fonctions membres
non statiques de la classe

Mthodes de classe

1re lettre en majuscule (convention Pascal case)

Ex: void ComputeDataNavigation( int altitude ,int longitude)

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

static void Main(string[] args)


{
// cration dun tableau de chat
Chat [] TabChat=new Chat[3];
// on peuple de tableau de chat
TabChat[0] = new Chat();

// au moment de la cration le
// constructeur est automatiquement appel

TabChat[1] = new Chat(10);


TabChat[2] = new Chat(10,"frisky");
TabChat[2].Miauler();
Console.WriteLine("Ce chat est un chat qui a " +
TabChat[2].Age + " ans");
TabChat[2].Age = 7;
Console.WriteLine("CE chat a " + TabChat[2].Age + "
ans");
Console.WriteLine("Il s'appelle " + TabChat[1].Nom);
Console.ReadKey();
}
}
}

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

static void Change(int[] pArray)


{
pArray[0] = 888; // This change
pArray = new int[5] {-3, -1, -2,
System.Console.WriteLine("Inside
}
static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Inside
Change(arr);
System.Console.WriteLine("Inside
}

affects the original element.


-3, -4};
// This change is local.
the method, the first element is: {0}", pArray[0]);

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

static void Main()


{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);
Change(ref arr);
System.Console.WriteLine("Inside 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: -3

Les gnriques
Un objectif: production des tructures informatiques gnriques
rutilisatisables pour diffrents types d'objets
Exemple typique: les conteneurs d'objets
Listes, piles

public class Stack<T>


{
int position;
T[] data = new T[100];
public void Push (T obj) { data[position++] = obj; }
public T Pop() { return data[--position]; }

Stack<int> stack = new Stack<int>();


Stack<Ville> stack2 = new Stack<Ville>();
stack.Push(5);
stack.Push(10);
int x = stack.Pop(); // x is 10
int y = stack.Pop();
Stack2.Push(new Ville( Toulon ));

Application

Exemple du poly:Les dictionnaires

Type gnrique ->


collection d'objets de type cl/ Valeur

public struct KeyValuePair<TKey, TValue>

public class Dictionary<TKey, TValue> :


IDictionary<TKey, TValue>,
ICollection<KeyValuePair<TKey, TValue>>,
IEnumerable<KeyValuePair<TKey, TValue>>,
IDictionary, ICollection, IEnumerable,
ISerializable, IDeserializationCallback

// 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));

Foreach (KeyValuePair<UInt32, Etudiant> kv in dicLPSE)


Console.WriteLine(kv.Key + "; " + kv.Value);

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

Classe d'objet faisant rfrence une ou plusieurs mthodes d'instances ou de


classes ayant un prototype spcifique (contrat d'appel)
Les dlgations sont du type delagate
delegate double T(int n);

La dlgation peut tre vu comme un contrat d'appel


Respect des prototypes des mthodes appeles
Un argument en sortie du type double
Un argument en entre de type int

Le dlgu

Instance d'une dlagation


Le dlgu est une rfrence vers ou un plusieurs mthodes
L'invocation du dlgu provoque l'appel des mthodes cibles

// Etape1: Contrat de delegation


delegate double T(int n);
// Etape2: Rfrence vers le dlgu
T de;

// Etape3 :Cration du dlgu


de = new T(f); // fait rfrence f
Remarque: ALTERNATIVE avec tapes 2 et 3 runies
T de=f;

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}

Dlgations prdfinies dans System

Rpondent aux problmatiques usuelles

Transformer valeur, comparer 2 valeurs entre elles, valeur correspond critre oui/non

namespace System{
public delegate
public delegate
public delegate
public delegate
.......
}

void Action<T> ( T obj);


void Predicate<T> ( T obj);
void Converter<T,U> ( T obj);
int Comparison<T> ( T obj,T y);

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 )

Interprtation: ma mthode de trie devra respecter le contrat impos


par la dlagation int Comparison<in T> ( T obj,T y);
2 paramtres (spcifi in car en entre ) de type gnrique T
Un entier en sortie
Si x>y alors on renvoie 1
Si x=y alors 0
Si x<1 alors -1

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,

);

);

La plupart des collections mettent la disposition de lutilisateur des mthodes


dextensions pour effectuer des traitements volus
Les mthodes dextensions sont trs utilises en conjonction avec des requtes LINQ

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

public static Int64 AverageRectangle(Rectangle r1)


{
Int64 result = r1.Aire;
return (result);
}
}

en oeuvre

Comment a marche?

La mthode Average va parcourir la liste .A chaque itration le


dlgu qui a t cre est invoqu. Votre mthode est donc
appele au travers du dlgu. A chaque appel on transmet un
Tsource (Rectangle) et on retourne un Int64. Ensuite la
mthode Average se charge de la somme des Int64 retourn
puis fait la division finale pour rerourner un double (la
moyenne)

Dlgation Func de signature:


1 paramtre en entre de type Tsource
1 paramtre en sortie de type long

Cration du dlgu ciblant la mthode OK

//exemple de delegation de type Func<xx,yy>


Func<Rectangle, Int64> selector = Rectangle.AverageRectangle;
double result = maList.Average(selector);

List<Rectancle> est aussi un


IEnumerable<Rectangle> ( OK MSDN)

// exemple avec methodeanonyme: version dlgu


double result2 = maList.Average(delegate(Rectangle r) { return (r.Aire); });
// exemple avec methodeanonyme: version lambda expression
double result3 = maList.Average((Rectangle r1) => r1.Aire);
Console.WriteLine("Moyenne des aires {0} {1}{2}",result,result2,result3);

// KO ambiguit double result4 =


maList.Average(Rectangle.AverageRectangle);

Hritage
Voir votre cours de Java: notion identique

Objectif vis :la rutilisabilit et la fiabilit du code

Mise en facteur de champs et de mthodes communes (invariantes dans le


temps ) pour un ensemble d'objet
=> dfinition d'une classe de base et de classe drive (filiation)

Dfinit une relation : "est un"

Un chat est un mammifre , une voiture est un vhicule

une classe drive est une spcialisation de la classe de base.


Hritage de l'tat et des mthodes de l'anctre
Rajout de nouvelles mthodes
Spcialisation de mthodes de la classe (rcriture)

Attention: une classe ne peut driver que d'une classe unique


Pas d'hritage multiples

public class Mammifere


{
// proprits automatique
protected int Age {get;set;}
// constructeurs
public Mammifere() { Console.WriteLine("Ctor Mammifere 1"); }
public Mammifere(int f_age)
{
Console.WriteLine("Ctor Mammifere 2");
Age=f_age;
}
//methodes
public void Crier() {Console.WriteLine("Raaaa");}
}

class Chien : Mammifere


{ // propit auto
public RACE Race { get; set; }
// ctor 1
public Chien(int f_age,RACE f_race):base(f_age)
{ Console.WriteLine("Ctor Chien 2"); Race = f_race; ; }

};

// 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

Objet manipul au travers d'une rfrence type de base


Chien unChien2 =new Chien(5, RACE.GOLDEN);
Mammifere autreMammifere2= unChien2; //Upcast

Cette convertion russit toujours condition de respecter la filiation des


classes
Mot cl is et as pour valider la convertion sans exception

Spcialisation sans mot cl virtual

Quelle est l'action produite par? autreMammifere2.Crier()


Resultat: Raaaa et non Ouarfff

Pourquoi considrer un chien comme un mammifre alors?

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

Mammifere mam1 = new Chat(); // Upcast OK


mam1.Crier();
mam1.Sous_Ordre_Especes();
mam1.NbreDePattes();

Miaouu
Flids
Inconnu

mam1 = new Chien(); // mam1 pointe vers un chien maintenant Upcast


OK
mam1.Crier();
mam1.Sous_Ordre_Especes();
mam1.NbreDePattes();
Ouarfff
Mammifere
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

L'intrt de cette approche est de pouvoir unifier un traitement


appliqu des objets de nature diffrente
// On regroupe tout le monde sous le type de base
List<Mammifere> maMenagerie=new List<Mammifere>() ;
// Je peuple la mnagerie
maMenagerie.Add(new Chat());
maMenagerie.Add(new Chien());
maMenagerie.Add(new Mammifere()
// Je fais crier tous le monde

Miaouu
Ouarfff
Raaaa

foreach (Mammifere mam in maMenagerie)


mam.Crier();
TRAITEMENT DE BASE APPLIQUE A DES OBJETS DIFFERENTS( MAIS APPARTENANT A LA MME CLASSE DE BASE)

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

Une classe abstraite n'est pas instantiable!

peut tre utilise uniquement si une classe nouvelle est drive d'elle

Les classes abstraites sont un outils puissants de modlisation

Dfinition en amont du projet des fonctionnalits et interactions des


diffrents objets
Elles permettent un dcouplage entre la dfinition et l'implmentation d'un
objet
Dfinisse un cadre commun pour les quipes de dveloppement

abstract class A_Fiche


{
protected int valeur=10;
public void test()
{ Console.WriteLine("test"); }

abstract public int AccessValeur


{ get; set; } // PAS DE CORPS!!!!
}

class Fiche1 : A_Fiche1


{
//OBLIGATION dIMPLENTER lACCESSEUR!
public override int AccessValeur
{
get { return (valeur); }
set { valeur = value; }
}

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

Quand utiliser des interfaces

La modlisation par classe (abstraite ou non) est privilgier

On y retrouvera "le cur de mtier" ( caractriques intrinsques)

Les interfaces sont reserver:

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.

Tous les mammifres ne sont pas volants (interface Ivolant)


Les ouvrages (livres, DVD) d'une bibliothque ne sont pas tous empruntables (interface Iempruntable)
formes en 2D:
-Cacul primtre et une surface (=> classe de base).
-Certaines formes sont dfinies l'aide d'une liste de point (rectangle , carr, losange, triangle), d'autre non ( cercle)
=> interface Ipoint
Stock Options des employs dune entreprise (tous le monde nest pas la mme enseigne ! Sic.) : IBonus

Interfaces
Un exemple

Mise ne place des dfinitions

//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"); }
}

// Chien est un mammifre qui a aussi des pattes


class Chien : Mammifere,IPatte
{ // Implantation de NbPatte dfini dans IPatte
public int NbPatte
{
get {return(2);}
}
// surcharge polymorphe des classes de bases
public override void Crier() { Console.WriteLine("Ouarfff"); }
public override void Sous_Ordre_Especes() {
Console.WriteLine("Canids"); }
}
class Baleine : Mammifere
{
// surcharge polymorphe des classes de bases
public override void Crier() { Console.WriteLine("Mouuuuu"); }
public override void Sous_Ordre_Especes() { Console.WriteLine("Ctacs");}
}
// Chien est un mammifre avec les fonctionnalits: pattes + volant
class ChauveSouris : Mammifere,IVolant,IPatte
{
// Implantation de NbPatte dfini dans IPatte
public int NbPatte
{
get {return(2);}
}
// Implantation de Vole dfini dans IVolant
public void Vole() { Console.WriteLine("Flap flap"); }
// surcharge polymorphe des classes de bases
public override void Crier() { Console.WriteLine("Mriiiiii"); }
public override void Sous_Ordre_Especes() {
Console.WriteLine("chiroptres");}
}

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

Objectif : formaliser certaines fonctionnalits rcurrentes en algorithme


Cloner un objet: ICloneable<T>
Parcourir un liste d'objet: IEnumerable<T>
Comparer des objets
IEquatable<T>, IEqualityComparer<T>

public class Temperature : IEquatable<Temperature>


{
// CHAMPS
protected double m_Temperature_Moyenne = 0.0;
//ACCESSEURS
public double Kelvin
{
get
{ return m_Temperature_Moyenne; }
set
{
if (value < 0.0)
throw new ArgumentException("Temperature >0 svp");
else
m_Temperature_Moyenne = value;
}
}
// CTOR
public Temperature(double degreesKelvin1, double degreesKelvin2)
{
this.Kelvin = (degreesKelvin1 + degreesKelvin2) / 2;
}
// Implmentation de Iequatable : <T> de type Temperature
public bool Equals(Temperature other)
{
// appel de mthode par dfaut Equals des types par valeurs double.Equals
return m_Temperature_Moyenne.Equals(other.m_Temperature_Moyenne);
}}

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");

Vous aimerez peut-être aussi