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]