1 Programmation Orientee Objet en CSharp (5)

Embed Size (px)

Citation preview

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 1

    Programmation Oriente Objet en C#

    1 Introduction

    1.1 Prsentation

    Tout bon dveloppeur le sait, le code d'un programme doit tre propre, comment, facile

    maintenir et amliorer.

    Vous tes adepte de la programmation procdurale et souhaitez apprendre la programmation

    objet ? Alors ce tutoriel est fait pour vous.

    A travers celui-ci, vous dcouvrirez toutes les notions, aussi bien basiques qu'avances, de la

    POO (Programmation Oriente Objet). Ces notions sont pour la plupart communes tous les

    langages Objet (C#, Java, PHP, etc).

    Voici un avant-got de ce qui vous attend :

    Classe et objet

    Attribut et visibilit

    Constructeur et mthodes

    Hritage

    Interface et classes abstraites

    Classe et mthodes gnriques

    Classe scelle

    En vrac, on peut galement parler d'initialiseur, d'indexeurs, de surcharge de mthodes et

    d'oprateurs, de classes partielles, d'expressions lambda, de types anonymes, etc.

    1.2 Le langage C#

    Pour illustrer nos propos, nous utiliserons le langage C# (Prononcez C-sharp). Sachez

    nanmoins que ce tutoriel peut tre suivi indpendamment du langage de programmation

    utilis puisque que, comme dis plus haut, les notions de programmation objet sont les mmes

    pour tous les langages.

    C# est un langage apparu en 2001 et spcialement cre par Microsoft pour tre utilis avec le

    Framework .NET. Microsoft a galement sorti durant cette mme anne Visual Studio, son

    IDE (Integrated Development Environement) ddi au .NET.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 2

    Une nouvelle version, nomm Visual Studio 2010, sera disponible en avril prochain et

    introduira galement le framework .NET 4.0

    1.3 Prrequis

    Premire chose dont nous aurons besoin pour raliser ce tutoriel, le framework .NET,

    videmment. La version 3.5 SP1 est actuellement la dernire en date. Vous pouvez la

    tlcharger directement depuis le centre de tlchargement Microsoft.

    Les utilisateurs de Windows 7 n'auront pas besoin de le tlcharger ni de l'installer puisque ce

    dernier est intgr de base dans le systme.

    Deuxime lment, il nous faut bien videmment un outil de dveloppement. Microsoft met

    disposition de tous, gratuitement, Visual Studio C# Express 2008, qui est une sous-version de

    Visual Studio spcifique au C#.

    Vous pouvez galement vous procurer la version RC de Visual Studio 2010 gratuitement.

    Attention, il ne s'agit pas la version finale, qui elle, sera payante.

    Si vous n'avez jamais fais de programmation oriente objet, il se peut fortement que ce

    tutoriel vous paraisse complexe. Il y a beaucoup de notions retenir et je vous conseille

    vivement de pratiquer en mme temps que vous suivez ce tutoriel.

    Par ailleurs, vous devez dj avoir fais de la programmation avant d'attaquer ce tutoriel, nous

    ne reviendrons pas sur les notions de fonctions, paramtres, variables, etc.

    Pour vous faciliter la tche, vous pouvez ds maintenant rcuprer le projet Visual Studio qui

    contient les diffrents fichiers que j'utiliserai tout au long de ce tutoriel.

    Si l'image n'apparait pas, cliquez ici.

    Une fois que Visual Studio est install, crez un nouveau projet en cliquant sur Fichier >

    Nouveau > Projet, puis choisissez Application console.

    Si tout va bien, vous devez obtenir cela :

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 3

    Si c'est le cas, alors tout va bien, nous pouvons commencer !

    2 Notions basiques

    2.1 Contexte

    Pour illustrer les notions de la POO que nous allons vous enseigner, nous utiliserons tout au

    long de ce tutoriel l'exemple d'une gestion de banque.

    Dans cette banque, les clients possderont au minimum un compte bancaire (ils pourront en

    avoir plusieurs). Ce compte sera soit de type Courant, soit de type Epargne.

    2.2 Classe et objet

    Notion fondamentale et totalement indispensable la POO, la classe.

    Une classe correspond la dfinition d'un ensemble d'entits partageant les mmes attributs,

    les mmes oprations et la mme smantique. En fait, une classe sert modliser un lment

    et va servir en tant que conteneur.

    Dans notre cas, nous devons modliser des clients qui possderont des comptes bancaires.

    Commenons donc par crer une classe Client.

    Pour cela, sous Visual Studio, dans le panneau droit Solution Explorer, cliquez droit sur le

    nom de votre projet (ConsoleApplication par dfaut), puis cliquez sur Ajouter > Classe.

    Appelez votre classe Client, puis confirmez.

    Visual Studio va alors vous crer votre premire classe grce au mot cl class.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 4

    Pour l'instant, il ne s'agit que d'une dfinition, votre classe est inutilisable en tant que telle.

    Pour l'utiliser, il faut tout d'abord comprendre la notion d'objet.

    Un objet, caractris par un nom, correspond l'instance d'une classe. Un objet regroupe un

    ensemble d'informations qui correspondent en fait aux valeurs des attributs d'une mme

    classe.

    On peut alors crer un objet de type Client nomm monPremierClient, puis un autre nomm

    monSecondClient, etc. Ces objets ainsi nomms permettront d'agir directement sur le

    contenu de la classe Client.

    Ces quelques lignes de codes, placer dans le fichier Program.cs (qui contient la mthode

    Main et qui servira de point de dmarrage), servent instancier trois objets de type Client.

    Pour instancier un objet, la syntaxe respecter est donc la suivante :

    Nom_De_La_Classe identifiant = new Nom_De_La_Classe();

    La deuxime partie, new Client(), correspond en fait l'appel du constructeur. Vous verrez

    cette notion dans la partie 2.4.

    Si ces deux notions vous paraissent pour l'instant trs abstraites, c'est normal, ne vous

    inquitez pas. N'hsitez pas relire plusieurs fois les dfinitions, puis passez la suite.

    2.3 Attributs, mthodes et visibilit

    Pour le moment, notre classe est cre, mais elle est vide. Pour modliser nos clients travers

    la classe du mme nom, il va falloir ajouter cette classe des attributs.

    Un attribut correspond une variable stockant une information au sein d'une classe. Les

    attributs sont en fait des caractristiques de la classe dans laquelle ils sont contenus.

    Dans notre cas, qu'est-ce que qui caractrise un client ? Son nom, son prnom, son ge, sa

    taille, son poids, son sexe, sa couleur de peau, etc. Nous allons donc crer ces attributs.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 5

    Voici quelques dtails sur les quatres attributs crs :

    _nomClient de type chaine de caractre

    _prenomClient de type chaine de caractre

    _ageClient de type entier

    _tailleClient de type double

    Vous vous demandez probablement quoi sert le mot "cl" private ? Il s'agit de la visibilit

    de nos attributs.

    La visibilit sert dfinir les droits d'accs aux donnes. Il existe pour cela trois niveaux

    correspondant trois mots cls :

    public : Il s'agit du niveau le moins lev. Un attribut dfinit comme public sera

    accessible depuis n'importe quel endroit.

    private : Un attribut dfinit en tant que private ne sera accessible qu'au sein de la

    classe dans laquelle il est dfinit. Il s'agit du plus haut niveau de protection.

    protected : Les attributs dfinis en tant que protected seront accessibles au sein de la

    classe dans laquelle ils sont dfinis, mais galement au sein de toutes les classes

    drives. Cette notion sera explique plus tard, oubliez-la pour l'instant.

    Par convention, les attributs de type private doivent commencer par un underscore "_" en C#.

    De mme, tout attribut doit utiliser une notation dite lowerCamelCase, c'est--dire dont le

    premier mot commence par une minuscule et tous les autres par une majuscule.

    Par dfaut, en C#, les attributs et mthodes possde le niveau de protection private, donc

    accessible uniquement au sein de la classe dans laquelle ils sont dfinis.

    En fait, il existe un quatrime niveau de protection nomm internal. Sachez simplement que

    celui-ci est utilis par dfaut sur les classes et permet, grossomodo, d'autoriser l'accs aux

    classes dans tout votre projet.

    Passons maintenant aux mthodes. Il s'agit en fait de fonctions dfinies au sein de votre

    classe et qui vont vous permettre d'agir sur vos attributs. Tout comme les attributs justement,

    les mthodes possdent un niveau de visibilit.

    Voici un exemple :

    Le premier lment (public) dfini la visibilit de la mthode. Le deuxime correspond au

    type de retour, ici void puisqu'il n'y a aucun retour. Le troisime correspond au nom de la

    mthode et le quatrime la signature de la mthode. Ici () puisqu'il n'y a aucun paramtre

    passer.

    "Console.WriteLine" sert tout simplement afficher le texte pass en paramtre dans le flux

    de sortie standard, ici la console.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 6

    Puisque notre mthode est dclare comme public, cela signifie qu'elle est accessible depuis

    n'importe o. Nous pouvons donc utiliser nos objets prcdemment dclars pour appeler

    cette mthode.

    Comme vous le voyez, c'est trs simple. Il suffit d'utiliser votre objet, puis de faire suivre

    celui-ci du nom de la mthode spare d'un point. D'ailleurs, en mettant le point, Visual

    Studio vous proposera automatiquement un ensemble d'attributs et mthodes accessibles.

    Vous pouvez dornavant compiler votre projet et lancer l'application. Pour cela, cliquez sur

    Dbugger > Lancer sans dbugger ou utilisez le raccourci Ctrl + F5. Si vous avez suivi le

    tutoriel correctement, alors vous devriez voir apparatre le texte "Hello World !" affich dans

    la console.

    Comme vous l'avez vu, cette mthode n'utilise pas les attributs de notre classe Client, elle se

    contente simplement d'afficher du texte. En effet, nous ne pouvons pas encore utiliser les

    attributs puisque ceux-ci ne possdent pour l'instant aucune valeur.

    2.4 Constructeur

    Lorsque nous avons cr notre premier objet tout l'heure, je vous ai parl de constructeur. Il

    s'agit en fait d'une mthode spciale qui sera appele lors de l'instanciation d'un objet et qui

    servira initialiser les valeurs de vos attributs.

    Voici un premier exemple :

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 7

    Sa dfinition est la mme que pour n'importe quelle autre mthode ceci prs que le

    constructeur ne ncessite pas de spcifier un type de retour. Son nom doit obligatoirement

    correspondre au nom de votre classe.

    Dans notre constructeur, nous initialisons les valeurs de chacun des attributs caractrisant

    notre classe Client. Comme vous le voyez, vous pouvez utiliser des chaines de caractre, des

    entiers et mme la valeur null.

    Dans cet exemple, j'ai galement introduit le mot-cl this. Ce dernier fait rfrence l'objet

    partir duquel il est appel. Ainsi, en appelant ce constructeur depuis votre objet

    monPremierClient, this fera rfrence cet objet et initialisera les valeurs afin qu'elle soit

    disponible uniquement pour l'instance de la classe Client en cours d'utilisation.

    Imaginons maintenant que nous rcuprons des clients stocks dans une base de donnes.

    Nous voulons instancier un objet pour chaque client et donner directement aux attributs les

    valeurs rcupres dans la base.

    C'est tout fait possible ! Il suffit simplement de spcifier un nouveau constructeur. En fait,

    vous pouvez crer autant que constructeur que vous le souhaitez tant que leur signature est

    diffrente.

    Nous voici donc avec un nouveau constructeur qui prend cette fois-ci en paramtre quatre

    valeurs afin d'initialiser nos attributs.

    L'appel d'un constructeur avec des paramtres se fait de la mme manire qu'un constructeur

    sans paramtre, la diffrence qu'il faut lui passer des valeurs.

    Dans l'exemple ci-dessus, nous crons un objet de type Client nomm monClient. Les

    attributs seront initialiss de la faon suivante :

    _nomClient : "Skywalker"

    _prenomClient : "Luke"

    _ageClient : 30

    _tailleClient : 1.80

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 8

    Maintenant que nos attributs possdent tous une valeur, nous devrions pouvoir accder aux

    donnes n'est-ce pas ? H bien non, toujours pas !

    Rappelez-vous, nous avons dfini nos attributs avec le niveau de visibilit private ce qui les

    rend inaccessibles en dehors de la classe dans laquelle ils sont dfinis.

    2.5 Accesseur et mutateur

    Pour rendre nos attributs accessibles en dehors de la classe, il va falloir crer ce que l'on

    appelle des accesseurs (ou getter) et des mutateurs (ou setter). L encore, il ne s'agit ni plus

    ni moins que de mthodes dont le but est d'accder aux donnes.

    Les accesseurs serviront accder aux donnes en lecture, c'est--dire rcuprer les

    donnes, tandis que les mutateurs permettront d'y accder en criture, c'est--dire de modifier

    les valeurs des attributs. Pour le reste de ce tutoriel, j'utiliserais les mots getter et setter la

    place d'accesseur et mutateurs, ces derniers tant trs peu utiliss.

    Commenons avec un exemple pour accder au nom de notre client.

    Pour que notre getter soit accessible n'importe o, nous lui donnons une visibilit public.

    L'attribut tant de type chane de caractre (string), nous dfinissons le type string en tant que

    valeur de retour pour notre getter.

    Le nom de votre getter importe peu mais, par convention, ils sont souvent appels

    Get+Nom_attribut en UpperCamelCase, c'est--dire avec une majuscule en dbut de chaque

    mot.

    Le contenu de la fonction est trs simple, il s'agit simplement de retourner la valeur de

    l'attribut _nomClient faisant rfrence l'objet en cours d'utilisation (this).

    Ainsi, bien que votre attribut soit priv, vous pourrez dornavant accder sa valeur depuis

    n'importe quel endroit grce au getter publique que vous venez de crer.

    Le principe du setter est exactement le mme, sauf qu'il s'agit cette fois de modifier les

    donnes.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 9

    Les setter n'ayant aucune ncessit de retourner une valeur, ceux-ci sont dfinis avec void en

    type de retour. Par convention, ils seront nomms Set+Nom_attribut eux aussi en

    UpperCamelCase, tout comme toute autre mthode d'ailleurs.

    Le contenu est trs simple galement puisqu'il s'agit simplement de l'affectation d'une valeur

    notre attribut. Vous pourrez dornavant modifier les valeurs de vos attributs partir de

    n'importe o.

    Mettons tout de suite ceci en pratique.

    Dans cet exemple :

    1. Nous instancions un objet de type Client nomm monClient grce au constructeur sans paramtre.

    2. Nous utilisons le setter nomm SetNomClient afin de donner la valeur "Toto" l'attribut _nomClient.

    3. Nous affichons dans la console "Mon Client s'appelle Toto" grce l'appel du getter GetNomClient retournant la valeur de l'attribut _nomClient.

    Pour vous entraner, vous pouvez dfinir les setter et getter relatif chaque attribut puis crer,

    par exemple, une mthode ObtenirInformation() qui crirait dans la console l'ensemble des

    informations connues sur le client.

    2.6 Proprit et proprit automatique

    Les proprits sont utilises pour rendre accessible les getter et setter via un nom commun.

    Prenons directement un exemple en crant une proprit pour _prenomClient.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 10

    Notre proprit, quivalente un getter et setter combin, doit prendre comme type de retour

    le type de l'attribut concern. Ici, il s'agit de _prenomClient, soit d'une chaine de caractre, la

    mthode doit donc prendre un type string en tant que type de retour.

    Le principe est trs simple. Au lieu de possder deux mthodes (getter et setter) spares, les

    deux sont regroupes dans notre proprit au sein de deux blocs get et set. Cette dernire peut

    tre appele comme une simple mthode et Visual Studio dcidera automatiquement si il doit

    appeler le getter ou le setter.

    Premire ligne, je pense que vous avez maintenant saisi le principe, nous instancions un objet

    de type Client et nomm monClient.

    A la deuxime ligne, nous utilisons notre proprit PrenomClient en tant que setter et

    attribuons par le fait la valeur "Toto" l'attribut _prenomClient.

    Troisime ligne, nous utilisons la proprit PrenomClient en tant que getter et rcuprons la

    valeur contenu dans l'attribut _prenom afin de la stocker dans un string nomm prenomClient.

    Nous affichons ensuite ce prenom dans la console.

    La gestion des getter et setter devient ainsi transparent pour le dveloppeur qui n'a plus qu'

    retenir le seul nom de la proprit.

    Encore plus simple, il existe les proprits automatiques. Ces dernires combinent la fois

    l'attribut, son setter et son getter.

    Dans l'exemple suivant, nous "transformons" notre attribut _ageClient en proprit

    automatique et mettons jour les constructeurs pour prendre en compte cette modification.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 11

    Comme vous le voyez, une simple ligne nous permet de dfinir notre proprit. Nous

    obtenons donc :

    L'quivalent d'un attribut nomm AgeClient de type entier

    Un getter

    Un setter

    Son appel se fait comme une simple proprit.

    Il est certes bien plus rapide d'utiliser une proprit que de crer un attribut, un setter et un

    getter, mais il est tout aussi important de comprendre le fonctionnement de ces trois lments

    lorsqu'ils sont dclars sparment.

    2.7 Rcapitulatif

    Cette premire partie a dj probablement due vous donner du fil retordre. Nanmoins, il

    s'agit l de notions fondamentales qu'il faut absolument comprendre et matriser afin de passer

    la suite.

    Aussi, je vous je vous encourage vous entraner complter la classe Client pour

    comprendre parfaitement ces premiers principe.

    Voici un exemple de ce quoi votre classe complte pourrait ressembler.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 12

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 13

    Voici maintenant un exemple d'utilisation.

    Pour clore cette premire partie, faisons un rapide rappel de tout ce que nous venons de voir.

    Une classe correspond la dfinition d'un ensemble d'entits partageant les mmes

    attributs et mthodes.

    Un objet correspond l'instanciation d'une classe.

    Chaque attribut et mthode possde un niveau de visibilit qui peut tre soit public,

    c'est--dire accessible depuis n'importe o, soit private, c'est--dire accessible depuis

    la classe uniquement, ou soit protected, c'est--dire accessible depuis la classe o il

    est dfini et depuis les classes drives (notion que nous verrons dans la partie

    suivante).

    Pour que les attributs prennent des valeurs lorsque l'on instancie un objet, il faut

    utiliser les constructeurs. Une classe peut contenir un nombre infini de constructeur

    tant que ceux-ci ne possde pas la mme signature.

    Pour accder aux attributs d'une classe, il faut utiliser des getter (lecture) et setter

    (criture).

    Une proprit regroupe la fois un getter et un setter relatif un mme attribut.

    Une proprit automatique regroupe l'attribut, son getter et son setter.

    Dans la partie suivante, vous apprendrez entre autre ce qu'est l'hritage, le mot cl static, les

    interfaces, les classes abstraites et les classes imbriques.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 14

    3 Notions basiques, suite

    3.1 L'hritage

    Aprs avoir vu la cration des objets, l'initialisation des donnes (constructeur) et l'accs aux

    donnes (getter/setter), nous allons nous attaquer des notions un peu plus volues.

    Nanmoins, il s'agit toujours de notions fondamentales que vous devez absolument connatre

    pour matriser la programmation oriente objet.

    Rappelez-vous, dans notre cas de gestion de banque, chaque client doit possder au minimum

    un compte. Ce compte contient un identifiant, un libelle, un solde et une date d'ouverture.

    Pour la suite de cette partie, vous allez devoir crer la classe Compte. Les fainants peuvent

    directement la rcuprer ci-dessous.

    Si vous ne comprenez pas quelque chose dans cette classe, alors vous avez probablement mal

    compris une notion explique dans la partie prcdente. La seule nouveaut est l'utilisation

    d'un attribut de type DateTime qui sert, comme son nom l'indique, stocker une valeur

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 15

    relative une date. Vous pouvez utiliser cette attribut en tant que string si vous souhaitez

    simplifier son utilisation.

    Pour notre exemple, je vous ai galement dis qu'un compte devait tre soit de type courant,

    soit de type pargne. Alors, faut-il crer deux autres classes quasiment identique celle que

    nous venons de crer ? Non ! C'est ici qu'intervient l'hritage.

    L'hritage permet une classe d'hriter des donnes et mthodes d'une autre classe. On

    obtiendra alors un systme classe fille/mre (ou encore classe drive/gnrique) qui nous

    permettra de possder plusieurs classes possdant plus ou moins la mme dfinition, sans

    pour autant crire deux fois cette mme classe.

    Le principal intrt de l'hritage est de pouvoir ajouter des attributs et mthodes une classe

    tout en profitant de ceux de la classe mre. C'est exactement ce qu'il nous faut puisque chaque

    type de compte possde un identifiant, un libelle, un solde et une date d'ouverture, mais un

    compte pargne doit galement possder un taux d'intrt et un plafond, alors que le compte

    courant possde un dcouvert autoris.

    Sachez galement qu'une classe drive ne peut pas possder un niveau de visibilit plus lev

    que sa classe gnrique.

    Voyons tout de suite comment crer une classe drive.

    Enfantin non ? Il suffit simplement de faire suivre le nom de la classe d'un double point, puis

    du nom de la classe gnrique. De ce simple fait, notre classe CompteCourant bnficiera des

    attributs et mthodes de la classe Compte.

    La programmation objet introduit galement l'hritage multiple. Il s'agit simplement du fait

    qu'une classe puisse possder plusieurs classes gnriques. En C#, cette notion n'est pas

    disponible, du moins pas avec le framework 3.5, actuellement standard.

    Voici notre classe CompteCourant, entirement cre.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 16

    Au niveau des proprits, comme vous le voyez, seul DecouvertAutorise est cre. Notre

    classe CompteCourant tant drive de Compte, celle-ci bnficie directement des attributs

    IdCompte, LibelleCompte, SoldeCompte, DateOuvertureCompte de sa classe mre Compte.

    La nouveaut, c'est au niveau des constructeurs avec l'introduction du mot-cl base. Celui-ci

    fait rfrence au constructeur de la classe gnrique par rapport la classe dans laquelle il est

    appel. Ici, il appellera le constructeur sans paramtre (Compte()) de la classe Compte.

    La syntaxe est la mme que pour spcifier l'hritage entre deux classes, il suffit de crer le

    constructeur CompteCourant() comme si de rien n'tait, puis de faire suivre ce dernier par

    base() prcd d'un double point. De ce fait, les attributs de la classe Compte seront initialiss,

    ainsi que l'attribut DecouvertAutorise, propre la classe CompteCourant.

    Pour le deuxime constructeur, il s'agit du mme principe sauf que, cette fois, nous passons

    des paramtres au constructeur. Pour pouvoir passer des paramtres au constructeur base(), il

    faut absolument que ces derniers soient dfinis dans la signature du constructeur fille, soit ici

    CompteCourant().

    De ce fait, les attributs de la classe Compte seront initialiss avec les valeurs que vous aurez

    passes en paramtre, tout comme pour l'attribut DecouvertAutorise, propre

    CompteCourant.

    Si vous avez compris le principe, vous devriez tre capable de raliser la classe

    CompteEpargne. Celle-ci possde, en plus de tous les attributs d'un compte standard, un taux

    d'intrt, ainsi qu'un plafond.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 17

    Le principe est exactement le mme et vous devriez normalement tre capable de comprendre

    le code ci-dessus tout seul.

    Pour utiliser des classes hrites, le principe est le mme qu'avec les classes standards. Voici

    un exemple ci-dessous.

    Dans un premier temps, nous instancions un objet monCompte de type Compte, tout ce qu'il y

    a de plus normal. En deuxime, nous instancions un objet cc de type CompteCourant en

    appelant le constructeur contenant des paramtres. Souvenez-vous, ce dernier va seulement

    garder la valeur relative l'attribut DecouvertAutorise (ici, 1000) puis passer les autres au

    constructeur de la classe mre Compte.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 18

    Troisime exemple avec un objet de type CompteEpargne. Cette fois-ci nous utilisons le

    constructeur vide (qui va attribuer des valeurs par dfaut nos attributs) puis appelons les

    mthodes de la classe mre Compte pour donner des valeurs nos attributs.

    Comment se fait-il que l'appel de ces mthodes soit possible ? Car ces dernires sont dfinies

    avec une visibilit public, donc accessible de n'importe o.

    Mais dans ce cas, comment faire pour que celles-ci ne soient pas accessibles depuis n'importe

    quel endroit, mais que nous y ayons toujours accs depuis notre classe drive ?

    Dans la premire partie, je vous parlais d'un niveau de visibilit protected. C'est ici que celui-

    ci intervient. Ce niveau de visibilit permet aux attributs et mthodes qui l'utilisent d'tre

    accessibles uniquement depuis la classe dans laquelle ils sont dfinis et dans les classes

    drives.

    Voyons ce qu'il se passe si nous dfinissons le getter IdCompte en tant que protected.

    Vous pouvez dornavant essayer de

    rcuprer la valeur de IdCompte depuis votre fichier Program.cs, cela sera impossible. A

    partir de maintenant, l'attribut IdCompte n'est accessible que dans la classe Compte et dans les

    classes qui en drivent.

    En revanche, nous pouvons par exemple crer une mthode recupererIdCompte() au sein de la

    classe CompteEpargne qui, elle, nous autorisera rcuprer la valeur de cet attribut.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 19

    Dans l'exemple ci-dessus, la mthode recupererIdCompte, dclare avec une visiblit public,

    nous permet d'accder la valeur de l'attribut IdCompte, pourtant dclar en tant que

    protected.

    Pour la suite de ce tutoriel, nous considrerons que le getter IdCompte est nouveau public.

    3.2 Les classes scelles

    Le principe des classes scelles en C# est trs simple, il s'agit simplement de rduire les

    fonctionnalits d'hritage. Une classe scell, dfinie avec le mot cl sealed est une classe que

    vous ne pouvez pas driver.

    Ainsi, si nous dfinissons notre classe Compte en tant que classe scelle, il sera impossible de

    crer nos classes ComtpeEpargne et compteCourant en tant que classes drives de Compte.

    Pour la suite de ce tutoriel, nous repassons la classe Compte en tant que classe non scelle.

    3.3 Le mot cl static

    Voici une nouvelle notion fondamentale la POO, l'utilisations du mot-cl static. Celui-ci

    peut s'appliquer aussi bien une classe, qu' un attribut ou une mthode. Nous traiterons ces

    trois cas sparment.

    Une mthode, attribut ou proprit dclare avec le mot cl static peut tre accessible sur une

    classe mme si aucun n'objet de cette classe n'a t instanci.

    Dans notre cas, imaginons que le taux d'intrt de nos comptes pargne soit fix 1.2%.

    Plutt que d'initialiser ce taux 1.2 avec le constructeur, nous allons modifier l'attribut pour le

    dfinir en tant que static. Ainsi, la valeur sera accessible tout moment sans instancier d'objet

    de type CompteEpargne.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 20

    Comme vous le constatez, l'attribut static _interet est accessible alors que nous n'avons

    instanci aucun objet.

    Le principe est le mme pour les mthodes statiques. Ces dernires sont accessibles sans

    instancier d'objet. Une mthode statique ne peut pas permettre d'accder des lments non

    statiques.

    Voici un exemple d'utilisation.

    La mthode, dfinie en tant que mthode statique peut tre appele sans instancier d'objet. En

    revanche, l'exemple suivant ne fonctionnera pas :

    Enfin, les classes statiques :

    Elles ne peuvent pas tre instancies

    Elles doivent contenir uniquement des mthodes et attributs statiques

    Elles sont scelles par dfaut (ne peuvent pas tre drives)

    Elles ne peuvent pas contenir de constructeur

    Voici un exemple d'utilisation de classe statique :

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 21

    Notre classe InformationBanque contient un ensemble d'informations relatives la banque et

    qui, par consquent ne changeront jamais, c'est pour cela qu'il est judicieux de dfinir cette

    classe en tant que statique.

    InformationBanque contient uniquement des mthodes et attributs statiques. Le contraire

    engendrerait un problme lors de la compilation.

    Ce qu'il faut retenir :

    Une classe statique ne contient que des lments statiques, mais des lments statiques

    ne sont pas forcment contenus dans une classe statique.

    Les mthodes et attributs dfinis comme statiques sont accessibles sans instancier

    d'objet.

    3.4 Les classes abstraites

    Dans la partie 3.2, nous vous apprenions ce qu'tait une classe scelle, c'est--dire une classe

    qui ne peut pas tre drive. Les classes abstraites sont en quelques sortes l'inverse des

    classes scelles, il s'agit de classe qui doivent tre drives pour tre utilisable.

    En effet, une classe dclare en tant que classe abstraite n'est pas instanciable. En revanche,

    contrairement une classe static, elle n'est pas accessible, ce qui la rend inutilisable en tant

    que telle.

    Pour revenir notre exemple, si l'on rflchit bien au contexte, un compte est soit un compte

    pargne, soit un compte courant, mais ne peut pas tre un compte tout simplement. Dans ce

    cas, il serait logique de dfinir notre classe Compte en tant que classe abstraite afin que cette

    dernire ne puisse pas tre instancie.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 22

    Il suffit simplement de rajouter le mot abstract devant le mot-cl class. Cette simple

    modification nous empche d'instancier tout objet de type Compte. Vous pouvez essayer de le

    faire via l'exemple utilis prcdemment, vous obtiendrez une erreur lors de la compilation.

    En revanche, cela ne change absolument rien pour nos classes CompteEpargne et

    CompteCourant. Ces deux classes drivent toujours de la classe Compte et peuvent toujours

    tre instancies et utilisables.

    Sachez qu'il est galement possible de dfinir des mthodes abstraites. Celles-ci doivent alors

    :

    Etre obligatoirement contenues dans une classe abstraite.

    Ne contenir qu'une signature et aucune dfinition.

    Etre obligatoirement implmentes dans toute classe drive.

    Ceci faisant appel un concept avanc de la POO, nous n'en parlerons pas plus pour l'instant.

    Vous retrouverez cette notion explique plus en dtail dans les parties suivantes.

    3.5 Les interfaces

    Les interfaces sont trs proches des classes abstraites.

    Une interface dfinit un contrat que la classe qui l'implmente doit respecter. Les

    interfaces ne peuvent pas tre instancies.

    Au lieu de parler de drivation, on parle d'implmentation.

    Une interface ne possde que des mthodes. (En fait, elle peut possder galement

    d'autres lments que nous verrons dans la partie avance de ce tutoriel).

    Lorsqu'une classe implmente une interface, cette classe doit obligatoirement

    implmenter toutes ses mthodes.

    Les mthodes dclares dans les interfaces ne possdent pas de dfinition.

    La dclaration d'une interface se fait grce au mot-cl interface.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 23

    Par convention, le nom d'une interface doit toujours commenc par "I". Dans notre exemple,

    IComparable est une interface propre au framework .NET, vous n'avez donc pas la redfinir.

    L'interface comporte une unique mthode, CompareTo, qui prend en paramtre un objet.

    Admettons que notre classe Compte ait besoin de cette interface. Cette dernire devra alors

    implmenter la mthode CompareTo, sous peine de rencontrer une erreur lors de la

    compilation.

    L'implmentation d'une interface se fait de la mme faon que l'hritage d'une classe

    gnrique, il suffit de sparer le nom des deux classes par un double-point.

    Contrairement l'hritage, une classe peut implmenter plusieurs interfaces. De mme, une

    classe peut hriter d'une autre classe tout en implmentant une ou plusieurs interfaces. Pour

    cela, il suffit de sparer les classes gnriques et interfaces par des virgules.

    Dans notre exemple, la classe CompteEpargne hrite de la classe Compte, mais implmente

    galement les interfaces IComparable et ICloneable.

    3.6 Les classes imbriques

    Jusqu' maintenant, nous savions qu'une classe pouvait contenir des attributs, des proprits et

    des mthodes. Mais ce n'est pas tout, les classes peuvent aussi contenir d'autres classes. Ce

    principe s'appelle classe imbrique.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 24

    Les classes imbriques sont souvent utilises pour structurer une classe en diffrente sous

    classes qui n'auraient pas de relles significations si elles taient dclares sparment. Cette

    notion permet galement de cacher cette classe aux utilisateurs.

    Seule une classe imbrique peut tre dfinie avec un niveau de visibilit private ou

    protected.

    Voici un exemple avec une classe Bijoux dclare en tant que classe imbrique dans la classe

    Client.

    Dfinie comme telle, la classe Bijoux ne sera accessible que depuis la classe Client. Cette

    notion tant assez peu utilise, nous ne dtaillerons pas plus son utilisation.

    3.7 Initialisateur d'objets

    Pour clore cette partie, nous allons voir ce qu'est un initialisateur d'objet. Cette notion est trs

    simple, il s'agit d'une faon d'initialiser les valeurs des attributs d'un objet lors de sa dfinition

    sans pour autant utiliser le constructeur.

    Pour cela, reprenons la dfinition de notre classe Client.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 25

    Lors de la cration d'un objet Client, au lieu d'utiliser le constructeur, nous pouvez utiliser

    l'initialisateur d'objet pour accder aux attributs et proprits accessibles. Ici, on pourra

    initialiser les valeurs des proprits AgeClient et TailleClient, puisque ces dernires sont

    dfinies en tant que public.

    Le bout de code ci-dessus est quivalent :

    Pour utiliser l'initialisateur d'objet, il suffit simplement d'instancier son objet sans appeler le

    constructeur, puis de spcifier les diffrents attributs et/ou proprits spars par des virgule,

    le tout entre accolades.

    3.8 Rcapitulatif

    Beaucoup de notions ont t vues dans cette deuxime parties ddies aux notions basiques de

    la programmation oriente objet. Encore une fois, il est fort probable que vous ne les ayez pas

    toutes saisies du premier coup. Je vous encourage donc les revoir afin de les matriser pour

    la suite.

    Voici un petit rcapitulatif des notions vues dans cette seconde partie :

    L'hritage permet une classe de driver d'une autre classe en lui permettant d'accder

    ses attributs et mthodes.

    Les attributs et mthodes dclars avec un niveau de visibilit protected sont

    accessibles depuis la classe dans laquelle ils sont dclars et dans les classes drivs.

    Les classes scelles ne peuvent pas tre drives.

    Les classes abstraites doivent tre drives pour tre utiles.

    Une classe abstraite peut contenir des mthodes non abstraites.

    Le mot cl static utilis sur des attributs ou mthodes permet d'y accder sans avoir

    besoin d'instancier d'objet.

    Une classe statique ne peut pas tre instancie, ne doit contenir que des lments

    statiques et est scelle par dfaut.

    Une interface dfinit un contrat que la classe qui l'implmente doit respecter.

    Les mthodes dfinies dans une interface ne doivent pas contenir de dfinition et

    doivent tre obligatoirement redfinis dans la classe qui implmente cette interface.

    Les classes imbriques permettent de structurer des classes qui n'auraient aucune

    signification si elles taient dfinies sparment.

  • Wooshi Programmation Oriente Objet en C# 27 fvrier 2010

    Copyright Wooshi 2009 - 2010 Page | 26

    L'initialisateur d'objet permet d'initialiser les valeurs des attributs accessibles d'une

    classe, sans pour autant appeler de constructeur lorsque l'on instancie un objet.

    Dans la prochaine partie, nous attaquerons les notions avances. En vrac, nous pouvons citer

    les classes et mthodes partielles, les expressions lambda, la surcharge d'oprateur et de

    mthode, les types anonymes, les indexeurs, etc.

    Quoi qu'il en soit, si vous matrisez dj toutes les notions vues jusqu' maintenant, vous tes

    tout fait capable de faire un programme correct. Les notions avances sont, certes, trs

    puissantes, mais pas indispensables.

    [Pour l'instant, ce tutoriel s'arrte l. Il sera mis jour trs prochainement avec l'ajout des

    notions avances]