La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA © Patrick.

Présentations similaires


Présentation au sujet: "Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA © Patrick."— Transcription de la présentation:

1 Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab) de cette formation peuvent être utilisés gratuitement dans le cadre de tout enseignement à but non lucratif. Contacter moi avant toute utilisation non personnelle de ces supports :

2 Introduction à C#2 Plan Eléments de base Eléments de base Structures de contrôle Structures de contrôle Classes & objets Classes & objets Héritage, polymorphisme & interfaces Héritage, polymorphisme & interfaces Exceptions Exceptions Autres éléments de C# Autres éléments de C#

3 Introduction à C#3 Les espaces de noms Une ressource dans le code source a la possibilité dêtre déclarée et définie à lintérieur dun espace de noms. Une ressource dans le code source a la possibilité dêtre déclarée et définie à lintérieur dun espace de noms. Si une ressource nest déclarée dans aucun espace de noms elle fait partie dun espace de noms global et anonyme. Si une ressource nest déclarée dans aucun espace de noms elle fait partie dun espace de noms global et anonyme. Eléments de base using Foo1; using Foo1.Foo2; using System; namespace Foo1 { // ici les ressources de l'espace de noms Foo1 namespace Foo2 { // ici les ressources de l'espace de noms Foo1.Foo2 } // ici les ressources de l'espace de noms Foo1 }

4 Introduction à C#4 Organisation du code source Eléments de base Projet …… FichierN.cs Fichier1.cs Fichier2.cs Namespace 1 Namespace 2 Ressource B Namespace M Ressource A Ressource C Ressource D …

5 Introduction à C#5 La méthode Main() (1/2) Chaque assemblage exécutable a au moins une méthode statique Main() dans une de ses classes. Chaque assemblage exécutable a au moins une méthode statique Main() dans une de ses classes. Cette méthode représente le point dentrée du programme, cest-à-dire que le thread principal créé automatiquement lorsque le processus se lance va commencer par exécuter le code de cette méthode. Cette méthode représente le point dentrée du programme, cest-à-dire que le thread principal créé automatiquement lorsque le processus se lance va commencer par exécuter le code de cette méthode. Il peut y avoir éventuellement plusieurs méthodes Main() (chacune dans une classe différente) par programme. Le cas échéant, il faut préciser au compilateur quelle méthode Main() constitue le point dentrée du programme. Il peut y avoir éventuellement plusieurs méthodes Main() (chacune dans une classe différente) par programme. Le cas échéant, il faut préciser au compilateur quelle méthode Main() constitue le point dentrée du programme. Eléments de base

6 Introduction à C#6 La méthode Main() (2/2) Le programme suivant ajoute les nombres passés en arguments en ligne de commande, et affiche le résultat. Sil ny a pas dargument, le programme le signale : Le programme suivant ajoute les nombres passés en arguments en ligne de commande, et affiche le résultat. Sil ny a pas dargument, le programme le signale : Eléments de base using System; class Prog { static void Main(string[] args) { if (args.Length == 0) Console.WriteLine("Entrez des nombres à ajouter."); else { long result = 0; foreach( string s in args ) result += System.Int64.Parse(s); Console.WriteLine("Somme de ces nombres :{0}",result); }

7 Introduction à C#7 Les commentaires Il existe trois façons de commenter du texte dans un fichier source C# : Il existe trois façons de commenter du texte dans un fichier source C# : Le texte placé entre les balises /* suivie de */ est commenté. Ces balises peuvent éventuellement se trouver sur deux lignes différentes. Le texte placé entre les balises /* suivie de */ est commenté. Ces balises peuvent éventuellement se trouver sur deux lignes différentes. Si une ligne contient la balise // alors le texte de cette ligne qui suit cette balise est commenté. Si une ligne contient la balise // alors le texte de cette ligne qui suit cette balise est commenté. Si une ligne contient la balise /// alors le texte de cette ligne qui suit cette balise est commenté. De plus ce texte fera partie de la documentation automatique. Si une ligne contient la balise /// alors le texte de cette ligne qui suit cette balise est commenté. De plus ce texte fera partie de la documentation automatique. Eléments de base

8 Introduction à C#8 Plan Eléments de base Eléments de base Structures de contrôle Structures de contrôle Classes & objets Classes & objets Héritage, polymorphisme & interfaces Héritage, polymorphisme & interfaces Exceptions Exceptions Autres éléments de C# Autres éléments de C#

9 Introduction à C#9 Définition Une structure de contrôle est un élément du programme qui change le comportement par défaut de lunité dexécution (du thread). Rappelons que ce comportement par défaut est dexécuter les instructions les unes à la suite des autres. Une structure de contrôle est un élément du programme qui change le comportement par défaut de lunité dexécution (du thread). Rappelons que ce comportement par défaut est dexécuter les instructions les unes à la suite des autres. Trois familles de structures de contrôles: Trois familles de structures de contrôles: Les conditions, qui exécutent (ou pas) un bloc de code quà une certaine condition, portant généralement sur les états de variables et dobjets. Les conditions, qui exécutent (ou pas) un bloc de code quà une certaine condition, portant généralement sur les états de variables et dobjets. Les boucles, qui exécutent en boucle un bloc dinstructions. Le programmeur a le choix entre terminer de boucler après un certain nombre ditérations, ou terminer de boucler à une certaine condition. Les boucles, qui exécutent en boucle un bloc dinstructions. Le programmeur a le choix entre terminer de boucler après un certain nombre ditérations, ou terminer de boucler à une certaine condition. Les branchements ou sauts, qui permettent de rediriger directement vers une instruction particulière lunité dexécution. Les branchements ou sauts, qui permettent de rediriger directement vers une instruction particulière lunité dexécution. Structures de contrôle

10 Introduction à C#10 Les conditions Trois types de condition: Trois types de condition: if/else switch Lopérateur ternaire Lopérateur ternaire ?: Structures de contrôle if( b == true )// si b vaut true alors... if( i >= 4 && i<= 6)// si i dans l'intervalle fermé [4,6] alors... if( i 6)// si i hors de l'intervalle fermé [4,6] alors // s="bonjour" si i strictement inférieur à j, sinon s="hello" string s = i

11 Introduction à C#11 Les boucles Quatre types de boucle: Quatre types de boucle: while do/while for foreach Structures de contrôle int i=0;int j=8; while( i 9 ) { i++;j--; } int i=0;int j=8; do { i++;j--; } while( i 9) for(int i = 1; i<=6 ; i++)... int i = 3;int j=5; for(; i 1 ;i++, j--)... for( int i =6 ; i<9 ; ) {... i++;} int [] tab = {1,3,4,8,2}; // Calcul de la somme des éléments du tableau. int Somme = 0; foreach(int i in tab ) Somme += i; // Somme vaut : = 18

12 Introduction à C#12 Plan Eléments de base Eléments de base Structures de contrôle Structures de contrôle Classes & objets Classes & objets Héritage, polymorphisme & interfaces Héritage, polymorphisme & interfaces Exceptions Exceptions Autres éléments de C# Autres éléments de C#

13 Introduction à C#13 La Programmation Orientée Objet (POO ou OOP) Le concept de la programmation fonctionnelle est construit autour de la notion de fonction. Tout programme est un ensemble de fonctions sappelant entre elles. Le concept de la programmation fonctionnelle est construit autour de la notion de fonction. Tout programme est un ensemble de fonctions sappelant entre elles. Le concept de la programmation objet est construit autour des notions dobjet et de classe. Une classe est limplémentation dun type de données (au même titre que int ou une structure). Un objet est une instance dune classe. Le concept de la programmation objet est construit autour des notions dobjet et de classe. Une classe est limplémentation dun type de données (au même titre que int ou une structure). Un objet est une instance dune classe. Lavantage majeur de la POO sur la Programmation fonctionnelle est de réunir les données avec leurs traitements. Lavantage majeur de la POO sur la Programmation fonctionnelle est de réunir les données avec leurs traitements. Classes & objets

14 Introduction à C#14 Classe et membre Exemple de déclaration. Exemple de déclaration. Les membres dune classe sont des entités déclarées dans la classe. Les membres dune classe sont des entités déclarées dans la classe. Classes & objets class MaClasse { // Ici sont placés les membres de la classe MaClasse. static void Main(string[] args) { // Ici sont placés les instructions de la méthode Main(). } // Ici aussi, sont placés les membres de la classe MaClasse. }

15 Introduction à C#15 Structures vs. Classes La déclaration dune structure se fait avec le mot clé à la place de. La déclaration dune structure se fait avec le mot clé struct à la place de class. La principale différence est quune structure définit un type valeur alors quune classe définit un type référence. La principale différence est quune structure définit un type valeur alors quune classe définit un type référence. Une autre différence est que les structures ne connaissent pas la notion dhéritage dimplémentation (voir plus loin). Une autre différence est que les structures ne connaissent pas la notion dhéritage dimplémentation (voir plus loin). Une référence vers une instance dune structure peut être obtenue avec lopération de boxing. Une référence vers une instance dune structure peut être obtenue avec lopération de boxing. Classes & objets

16 Introduction à C#16 Les membres dune classe Six types de membres dune classe: Six types de membres dune classe: Les champs : un champs dune classe définit une donnée (type valeur) ou une référence vers une donnée (type référence) qui existe pour toute instance de la classe. Les champs : un champs dune classe définit une donnée (type valeur) ou une référence vers une donnée (type référence) qui existe pour toute instance de la classe. Les méthodes : peut être vu comme un traitement sur les données dun objet. Les méthodes : peut être vu comme un traitement sur les données dun objet. Les propriétés : peut être vu comme un couple de méthode pour intercepter les accès (lecture/écriture) aux données dun objet avec la syntaxe daccès aux champs. Les propriétés : peut être vu comme un couple de méthode pour intercepter les accès (lecture/écriture) aux données dun objet avec la syntaxe daccès aux champs. Les indexeurs : propriété spéciale utilisant la syntaxe daccès à un tableau []. Les indexeurs : propriété spéciale utilisant la syntaxe daccès à un tableau []. Les événements : facilite limplémentation de la notion de programmation événementielle. Les événements : facilite limplémentation de la notion de programmation événementielle. Les types encapsulés dans la classe. Les types encapsulés dans la classe. Classes & objets

17 Introduction à C#17 Encapsulation et niveau de visibilité Classes & objets

18 Introduction à C#18 Exemple: Propriétés, champs niveau de visibilité Classes & objets public class UneClasse { // Un champ privé de type int. private int m_ChampPrivé = 10; public int m_Prop // Une propriété publique de type int. { get{ return m_ChampPrivé;} set{ m_ChampPrivé = value;} } static void Main() { UneClasse A = new UneClasse(); A.m_Prop = 56; // L'accesseur set est appelé. int i = A.m_Prop;// L'accesseur get est appelé. }

19 Introduction à C#19 Les constructeurs Une méthode est automatiquement appelée lorsque lobjet est construit. On appelle ce type de méthode un constructeur (ctor en abrégé). Une méthode est automatiquement appelée lorsque lobjet est construit. On appelle ce type de méthode un constructeur (ctor en abrégé). En C#, syntaxiquement, une méthode constructeur porte le nom de la classe, et ne retourne rien (même pas le type void). En C#, syntaxiquement, une méthode constructeur porte le nom de la classe, et ne retourne rien (même pas le type void). Pour chaque classe il peut y avoir : Pour chaque classe il peut y avoir : Aucun constructeur : dans ce cas le compilateur fournit automatiquement un constructeur par défaut, qui naccepte aucun argument. Aucun constructeur : dans ce cas le compilateur fournit automatiquement un constructeur par défaut, qui naccepte aucun argument. Un seul constructeur : dans ce cas, ce sera toujours lui qui sera appelé. Le compilateur ne fournit pas de constructeur par défaut. Un seul constructeur : dans ce cas, ce sera toujours lui qui sera appelé. Le compilateur ne fournit pas de constructeur par défaut. Plusieurs constructeurs : dans ce cas ils diffèrent selon leurs signatures (i.e nombre et type des arguments). Le compilateur ne fournit pas de constructeur par défaut. Plusieurs constructeurs : dans ce cas ils diffèrent selon leurs signatures (i.e nombre et type des arguments). Le compilateur ne fournit pas de constructeur par défaut. Lorsquune méthode constructeur retourne, il est impératif que tous les champs de type valeur de la classe aient été initialisés. Lorsquune méthode constructeur retourne, il est impératif que tous les champs de type valeur de la classe aient été initialisés. Un constructeur admet un niveau de visibilité. Un constructeur admet un niveau de visibilité. Classes & objets

20 Introduction à C#20 Le destructeur On nomme destructeur la méthode de la classe qui est appelée par le ramasse-miettes juste avant quil désalloue la zone mémoire du tas occupée par lobjet. On nomme destructeur la méthode de la classe qui est appelée par le ramasse-miettes juste avant quil désalloue la zone mémoire du tas occupée par lobjet. Il ne peut y avoir plus dun destructeur dans une classe, et si le développeur nen écrit pas, le compilateur crée un destructeur par défaut. Il ne peut y avoir plus dun destructeur dans une classe, et si le développeur nen écrit pas, le compilateur crée un destructeur par défaut. Un destructeur est une méthode non statique avec le même nom que sa classe, et commençant par le caractère tilde ~. Un destructeur est une méthode non statique avec le même nom que sa classe, et commençant par le caractère tilde ~. Syntaxiquement, un destructeur nadmet pas dargument et ne retourne aucun type, même pas le type. Syntaxiquement, un destructeur nadmet pas dargument et ne retourne aucun type, même pas le type void. En interne, le compilateur C# fait en sorte quun destructeur est la réécriture de la méthode de la classe. En interne, le compilateur C# fait en sorte quun destructeur est la réécriture de la méthode Finalize() de la classe Object. Un destructeur nadmet pas de niveau de visibilité. Un destructeur nadmet pas de niveau de visibilité. Classes & objets

21 Introduction à C#21 Exemple: Construction et destruction des objets Classes & objets public class Article { private int Prix; public Article(int Prix) { this.Prix = Prix; } // ctor 1 public Article(double Prix) { this.Prix = (int) Prix; } // ctor 2 public Article() { Prix = 0; } // ctor 3 ~Article() { /* rien à désallouer!*/ } // dtor } class Prog { static void Main(string[] args) { Article A = new Article(); // Appelle le ctor 3. Article B = new Article(6); // Appelle le ctor 1. Article C = new Article(6.3); // Appelle le ctor 2. } // le ramasse miettes appelle le destructeur sur les objets A B et C // avant la terminaison du programme }

22 Introduction à C#22 Linterface IDisposable Technique pour pouvoir appeler automatiquement une certaine méthode sur un objet, quand on décide que lon naura plus besoin de ce dernier. Avantage par rapport au destructeur qui est appelé à un moment non déterminé. Lutilisation de cette technique naffecte en rien le ramasse-miettes. Classes & objets public class Article : IDisposable { // Déclaration des champs et méthodes... public void Dispose() { /* désallouer ici ce qui doit l'être*/} }... Article B = new Article(); using(B) // ATTENTION: rien à voir avec le using des espaces de noms { // Ici éventuellement utilisation de B. // Cette zone est appelée zone de validité de B. }// Cette accolade provoque l'appel automatique de B.Dispose(). // Fin de la zone de validité de B.

23 Introduction à C#23 Les membres statiques Les champs, les propriétés, les méthodes (y compris les constructeurs mais pas le destructeur) et les événements dune classe ont la possibilité dêtre déclaré avec le mot- clé. Les champs, les propriétés, les méthodes (y compris les constructeurs mais pas le destructeur) et les événements dune classe ont la possibilité dêtre déclaré avec le mot- clé static. Ce mot-clé signifie que le membre appartient à la classe, et non aux objets, comme cest le cas des membres non statiques. Ce mot-clé signifie que le membre appartient à la classe, et non aux objets, comme cest le cas des membres non statiques. Un membre statique a un niveau de visibilité. Un membre statique a un niveau de visibilité. Une méthode statique na pas accès aux méthodes, champs, propriétés et événements non statiques de la classe. Une méthode statique na pas accès aux méthodes, champs, propriétés et événements non statiques de la classe. Une méthode statique nest pas accessible à partir dune référence vers une méthode de la classe. Une méthode statique nest pas accessible à partir dune référence vers une méthode de la classe. Une méthode statique est accessible dans toutes les méthodes (statiques ou non) de la classe par son nom, et à lextérieur de la classe (si son niveau de visibilité le permet) par la syntaxe : Une méthode statique est accessible dans toutes les méthodes (statiques ou non) de la classe par son nom, et à lextérieur de la classe (si son niveau de visibilité le permet) par la syntaxe : NomDeLaClasse.NomDeLaMéthodeStatique() Classes & objets

24 Introduction à C#24 Exemple: Membres statiques Classes & objets public class Article { static int NbArticles; // Un champ statique. static Article() // Le constructeur statique. { NbArticles = 0; } int Prix = 0; // Un champ privé non statique. public Article( int Prix )// ctor non statique { this.Prix = Prix; NbArticles++; } ~Article() // dtor { NbArticles--; }

25 Introduction à C#25 Le mot clé this Dans toutes les méthodes non statiques, C# permet dutiliser le mot-clé. Dans toutes les méthodes non statiques, C# permet dutiliser le mot-clé this. Ce mot-clé est une référence vers lobjet sur lequel opère la méthode courante. Ce mot-clé est une référence vers lobjet sur lequel opère la méthode courante. Lutilisation de ce mot clé témoigne en général dune architecture objet évoluée : Lutilisation de ce mot clé témoigne en général dune architecture objet évoluée : Classes & objets class UneClasse { void fct() // méthode non statique { fct2(this); } static void fct2(UneClasse A ) { // travaille avec lobjet référencé par A... }

26 Introduction à C#26 Plan Eléments de base Eléments de base Structures de contrôle Structures de contrôle Classes & objets Classes & objets Héritage, polymorphisme & interfaces Héritage, polymorphisme & interfaces Exceptions Exceptions Autres éléments de C# Autres éléments de C#

27 Introduction à C#27 La problèmatique (1/2) La complexité dun programme en fonction de sa taille, grandit plus vite quune fonction linéaire de sa taille. La complexité dun programme en fonction de sa taille, grandit plus vite quune fonction linéaire de sa taille. Héritage, polymorphismes & interfaces Le travail de larchitecte (le designer) dun programme consiste à ce que la complexité reste aussi proche que possible de la fonction linéaire. Le travail de larchitecte (le designer) dun programme consiste à ce que la complexité reste aussi proche que possible de la fonction linéaire. Le mécanisme de dérivation ou dhéritage, est un des points clés de la programmation objet. Le mécanisme de dérivation ou dhéritage, est un des points clés de la programmation objet.

28 Introduction à C#28 La problèmatique (2/2) Souvent, dans une application, des classes ont des membres similaires car elles sont sémantiquement proche: Souvent, dans une application, des classes ont des membres similaires car elles sont sémantiquement proche: Les classes, et peuvent avoir en commun les champs,, et et les méthodes et. Les classes Secrétaire, Technicien et Cadre peuvent avoir en commun les champs Nom, Age, Adresse et Salaire et les méthodes Evalue() et Augmente(). Les classes, et peuvent avoir en commun les champs et et les méthodes, et. Les classes Carré, Triangle et Cercle peuvent avoir en commun les champs CouleurDuTrait et TailleDuTrait et les méthodes Dessine(), Translation() et Rotation(). Les classes, et peuvent avoir en commun les champs et et les méthodes et. Les classes Button, ComboBox et EditBox peuvent avoir en commun les champs Position et Enabled et les méthodes OnClick() et OnMouseOver(). On comprend bien que cest parce que: On comprend bien que cest parce que: Une secrétaire, un technicien ou un cadre est un employé (i.e une spécialisation du concept demployé). Une secrétaire, un technicien ou un cadre est un employé (i.e une spécialisation du concept demployé). Un carré, un triangle ou un cercle est une forme géométrique. Un carré, un triangle ou un cercle est une forme géométrique. Un bouton, une combo-box ou une edit-box est un contrôle graphique. Un bouton, une combo-box ou une edit-box est un contrôle graphique. Héritage, polymorphismes & interfaces

29 Introduction à C#29 La solution : Lhéritage Lidée de la réutilisation est de cerner ces similitudes, et de les encapsuler dans une classe appelée classe de base (par exemple, ou ). Lidée de la réutilisation est de cerner ces similitudes, et de les encapsuler dans une classe appelée classe de base (par exemple Employé, FigureGéométrique ou Control ). Les classes de base sont parfois appelées super classes. Les classes de base sont parfois appelées super classes. Une classe dérivée est une classe qui hérite des membres de la classe de base. Concrètement si hérite de, hérite des champs, etet des méthodes et. Une classe dérivée est une classe qui hérite des membres de la classe de base. Concrètement si Technicien hérite de Employé, Technicien hérite des champs Nom, Age, Adresse et Salaire et des méthodes Evalue() et Augmente(). On dit aussi que la classe dérivée est une spécialisation de la clase de base. On dit aussi que la classe dérivée est une spécialisation de la clase de base. Héritage, polymorphismes & interfaces

30 Introduction à C#30 Exemple : Lhéritage Héritage, polymorphismes & interfaces using System; class Employé { protected string Nom; protected Employé(string Nom) {this.Nom = Nom;} } class Technicien : Employé { private string Spécialité; public Technicien(string Nom, string Spécialité): base(Nom) {this.Spécialité = Spécialité;} } class Prog { public static void Main() { Employé E = new Technicien("Roger LaFleur","Electricien"); }

31 Introduction à C#31 Exemple : Schéma de dérivation Héritage, polymorphismes & interfaces CAnimal CMammifère CReptile CHumain CChien CLézard CBergerAllemand CLabrador CCaniche Des normes telles que UML (Unified Modelling Language) permettent de faire des schéma pour représenter les liens entre les classes: Des normes telles que UML (Unified Modelling Language) permettent de faire des schéma pour représenter les liens entre les classes:

32 Introduction à C#32 Méthodes virtuelles et polymorphisme (1/3) En POO on est souvent confronté au problème suivant : En POO on est souvent confronté au problème suivant : On crée des objets, instances de plusieurs classes dérivées dune classe de base, puis on veut leur appliquer un traitement de base, cest-à-dire, un traitement défini dans la classe de base. Le problème est que ce traitement diffère selon la classe dérivée. Le problème est que ce traitement diffère selon la classe dérivée. Par exemple on veut obtenir une description de tous les employés (traitement de base : obtenir une description dun employé, quelle que soit sa catégorie). Par exemple on veut obtenir une description de tous les employés (traitement de base : obtenir une description dun employé, quelle que soit sa catégorie). Héritage, polymorphismes & interfaces

33 Introduction à C#33 Méthodes virtuelles et polymorphisme (2/3) Héritage, polymorphismes & interfaces using System; public class Employé { // m_Nom peut être accédé dans les méthodes des classes dérivées. protected string m_Nom; public Employé(string Nom) {m_Nom = Nom;} public virtual void GetDescription() {Console.Write("Nom: {0}",m_Nom);} } class Technicien : Employé{ // Technicien hérite de Employé. public Cechnicien(string Nom):base(Nom) {} public override void GetDescription(){ // Appel de la méthode GetDescription() de Employé. base.GetDescription(); Console.Write(" Fonction: Cechnicien\n");} } class Secrétaire : Employé{ // Secrétaire hérite de Employé. public Secrétaire(string Nom):base(Nom) {} public override void GetDescription(){ // Appel de la méthode GetDescription() de Employé. base.GetDescription(); Console.Write(" Fonction: Secrétaire\n");} }

34 Introduction à C#34 Méthodes virtuelles et polymorphisme (3/3 ) Héritage, polymorphismes & interfaces... class Prog { static void Main(string[] args) { Employé [] Tab = new Employé[3]; Tab[0] = new Technicien("Roger"); Tab[1] = new Secrétaire("Lise"); Tab[2] = new Technicien("Raymond"); foreach( CEmployé e in Tab ) e.GetDescription(); } Nom: Roger Fonction: Technicien Nom: Lise Fonction: Secretaire Nom: Raymond Fonction: Technicien Ce programme affiche: Ce programme affiche:

35 Introduction à C#35 La problématique de labstraction Il arrive que lon nait pas de code à mettre dans la méthode virtuelle parce quil y a un manque dinformation à ce niveau de larbre dhéritage. Il arrive que lon nait pas de code à mettre dans la méthode virtuelle parce quil y a un manque dinformation à ce niveau de larbre dhéritage. Par exemple pour la classe il ny a rien à mettre dans la méthode virtuelle. En effet, à ce niveau de lhéritage on ne sait pas quel type de figure géométrique on instancie. Par exemple pour la classe FigureGéométrique il ny a rien à mettre dans la méthode virtuelle Dessine(). En effet, à ce niveau de lhéritage on ne sait pas quel type de figure géométrique on instancie. Une telle classe de base veut imposer des opérations à ces classes dérivées, alors quelle même na pas assez dinformations pour effectuer ces opérations, même en partie. Une telle classe de base veut imposer des opérations à ces classes dérivées, alors quelle même na pas assez dinformations pour effectuer ces opérations, même en partie. Héritage, polymorphismes & interfaces

36 Introduction à C#36 Labstraction Une classe abstraite est une classe qui doit déléguer complètement limplémentation de certaines de ces méthodes à ses classes dérivées. Une classe abstraite est une classe qui doit déléguer complètement limplémentation de certaines de ces méthodes à ses classes dérivées. Ces méthodes qui ne peuvent être implémentées sappellent des méthodes abstraites (ou virtuelles pures). Ces méthodes qui ne peuvent être implémentées sappellent des méthodes abstraites (ou virtuelles pures). La conséquence fondamentale: une classe abstraite nest pas instanciable. La conséquence fondamentale: une classe abstraite nest pas instanciable. Une autre conséquence est quune méthode abstraite ne doit pas avoir une visibilité privée. Une autre conséquence est quune méthode abstraite ne doit pas avoir une visibilité privée. Héritage, polymorphismes & interfaces

37 Introduction à C#37 Exemple: Labstraction Héritage, polymorphismes & interfaces abstract class FigureGéométrique { public abstract void Dessine(); } class Cercle : FigureGéométrique { private Point Centre; private double Rayon; public Cercle( Point Centre, double Rayon) {this.Centre = Centre;this.Rayon = Rayon;} public override void Dessine () { // dessine un Cercle à partir de son centre et de son rayon }... // erreur de compilation ! // ne peut instancier une classe abstraite ! FigureGéométrique UneFigure = new CFigureGéométrique(); // OK FigureGéométrique UneFigure = new Cercle(new Point(1,2),3);...

38 Introduction à C#38 Les interfaces Il existe des classes abstraites très particulières. Ce sont celles qui nont que des méthodes abstraites. Il existe des classes abstraites très particulières. Ce sont celles qui nont que des méthodes abstraites. En POO on les appelle les interfaces ou abstraction. En POO on les appelle les interfaces ou abstraction. On dit quune classe implémente une interface au lieu de dérive dune interface. On dit quune classe implémente une interface au lieu de dérive dune interface. Le point fondamentale: une classe peut implémenter plusieurs interfaces (et/ou dériver dune seule classe de base). Le point fondamentale: une classe peut implémenter plusieurs interfaces (et/ou dériver dune seule classe de base). Dans la déclaration dune interface, les méthodes ne peuvent avoir de niveau de visibilité. Cest aux classes qui limplémentent den décider. Dans la déclaration dune interface, les méthodes ne peuvent avoir de niveau de visibilité. Cest aux classes qui limplémentent den décider. Héritage, polymorphismes & interfaces

39 Introduction à C#39 Exemple: Les interfaces Héritage, polymorphismes & interfaces using System; interface IA{void f(int i);} interface IB{void g(double d);} class C : IA, IB { public void f(int i) { Console.WriteLine("f de C {0}",i);} public void g(double d){ Console.WriteLine("g de C {0}",d);} } class Prog { static void Main(string[] args) { // une référence interface sur un objet IA Obj1 = new C(); // une référence interface sur un objet IB Obj2 = new C(); // récupération de l'objet d'après une référence interface C RefSurObj2 = (C) Obj2; Obj1.f(5); }

40 Introduction à C#40 Les opérateurs is et as Lopérateur sert à déterminer à lexécution si une expression peut être transtypée (castée) dans un type donné. Cet opérateur retourne un booléen. Lopérateur is sert à déterminer à lexécution si une expression peut être transtypée (castée) dans un type donné. Cet opérateur retourne un booléen. Après avoir déterminé à lexécution si une expression peut être transtypée (castée) dans un type donné avec lopérateur, on réalise effectivement le transtypage la plupart du temps. Lopérateur permet deffectuer ces deux étapes. Si le transtypage ne peut avoir lieu, la référence nulle est retournée. Après avoir déterminé à lexécution si une expression peut être transtypée (castée) dans un type donné avec lopérateur is, on réalise effectivement le transtypage la plupart du temps. Lopérateur as permet deffectuer ces deux étapes. Si le transtypage ne peut avoir lieu, la référence nulle est retournée. Héritage, polymorphismes & interfaces

41 Introduction à C#41 Exemple: Les opérateurs is et as Héritage, polymorphismes & interfaces... static void Main(string[] args) { IARefA= new C(); IBRefB= null; IEnumerator RefE= null; CRefC= null; // Ici, le transtypage peut se faire. if( RefA is C ){ RefC = (C)RefA; // utilise RefC... } // équivalent à RefC = RefA as C; if( RefC != null ){// utilise RefC...} // Ici, le transtypage ne peut pas se faire. if( RefA is IEnumerator ){ RefE = (IEnumerator)RefA; // utilise RefE... } // équivalent à RefE = RefA as IEnumerator ; if( RefE != null ){// utilise RefE...} }

42 Introduction à C#42 Plan Eléments de base Eléments de base Structures de contrôle Structures de contrôle Classes & objets Classes & objets Héritage, polymorphisme & interfaces Héritage, polymorphisme & interfaces Exceptions Exceptions Autres éléments de C# Autres éléments de C#

43 Introduction à C#43 La problématique (1/2) Les applications doivent faire face à des situations exceptionnelles indépendantes du programmeur. Par exemple : Les applications doivent faire face à des situations exceptionnelles indépendantes du programmeur. Par exemple : Accéder à un fichier qui nexiste pas ou plus. Accéder à un fichier qui nexiste pas ou plus. Faire face à une demande dallocation de mémoire alors quil ny en a plus. Faire face à une demande dallocation de mémoire alors quil ny en a plus. Accéder à un serveur qui nest plus disponible. Accéder à un serveur qui nest plus disponible. Accéder à une ressource sans en avoir les droits. Accéder à une ressource sans en avoir les droits. Entrée dun paramètre invalide par lutilisateur (une date de naissance en lan 3000 par exemple). Entrée dun paramètre invalide par lutilisateur (une date de naissance en lan 3000 par exemple). Ces situations, qui ne sont pas des bugs mais que lon peut appeler erreurs, engendrent cependant un arrêt du programme, à moins quelles ne soient traitées. Ces situations, qui ne sont pas des bugs mais que lon peut appeler erreurs, engendrent cependant un arrêt du programme, à moins quelles ne soient traitées. Exceptions

44 Introduction à C#44 La problématique (2/2) Pour traiter ces situations on peut tester les codes derreur retournés par les fonctions critiques, mais ceci présente deux inconvénients : Pour traiter ces situations on peut tester les codes derreur retournés par les fonctions critiques, mais ceci présente deux inconvénients : Le code devient lourd, puisque chaque appel à une fonction critique est suivi de nombreux tests. Les tests ne sont pas centralisés. Le code devient lourd, puisque chaque appel à une fonction critique est suivi de nombreux tests. Les tests ne sont pas centralisés. Le programmeur doit prévoir toutes les situations possibles dès la conception du programme. Il doit aussi définir les réactions du programme et les traitements à effectuer pour chaque type derreur. Il ne peut pas simplement factoriser plusieurs types derreur en un seul traitement. Le programmeur doit prévoir toutes les situations possibles dès la conception du programme. Il doit aussi définir les réactions du programme et les traitements à effectuer pour chaque type derreur. Il ne peut pas simplement factoriser plusieurs types derreur en un seul traitement. En fait ces inconvénients sont majeurs. En fait ces inconvénients sont majeurs. Exceptions

45 Introduction à C#45 La solution: les exceptions Voici les étapes dans la gestion dune exception : Voici les étapes dans la gestion dune exception : Une erreur survient ; Une erreur survient ; On construit un objet qui contient, éventuellement, des paramètres descriptifs de lerreur. La classe dun tel objet est obligatoirement fille de la classe (directement ou indirectement) ; On construit un objet qui contient, éventuellement, des paramètres descriptifs de lerreur. La classe dun tel objet est obligatoirement fille de la classe System.Exception (directement ou indirectement) ; Une exception est lancée. Elle est paramétrée par lobjet ; Une exception est lancée. Elle est paramétrée par lobjet ; Deux possibilités peuvent alors survenir à ce moment : Deux possibilités peuvent alors survenir à ce moment : A) Un gestionnaire dexception rattrape lexception. Il lanalyse et a la possibilité dexécuter du code, par exemple pour sauver des données ou avertir lutilisateur. B) Aucun gestionnaire dexception ne rattrape lexception. Le programme se termine. B) Aucun gestionnaire dexception ne rattrape lexception. Le programme se termine. Exceptions

46 Introduction à C#46 Exemple: les exceptions Exceptions using System; public class Prog { public static void Main() { try { int i = 1; int j = 0; int k = i/j; } catch(System.DivideByZeroException) { Console.WriteLine("Une division entière par zéro a eu lieu!"); }

47 Introduction à C#47 Le gestionnaire dexception Un gestionnaire dexception peut contenir une ou plusieurs clauses, et/ou une clause Un gestionnaire dexception peut contenir une ou plusieurs clauses catch, et/ou une clause finally. La clause est toujours exécutée, quelle que soit lissue. La clause finally est toujours exécutée, quelle que soit lissue. Une exception lancée, instance dune classe dérivée de la classe de base, matche à la fois la clause et la clause. Doù: Une exception lancée, instance dune classe dérivée D de la classe de base B, matche à la fois la clause catch(D d) et la clause catch(B b). Doù: Dans le même gestionnaire dexception, le compilateur interdit les clauses catch de classes dérivées de B, après la définition dune clause. Dans le même gestionnaire dexception, le compilateur interdit les clauses catch de classes dérivées de B, après la définition dune clause catch(B b). La clause rattrape toutes les exceptions puisque toutes les classes dexception dérivent de la classe. Si elle est présente dans un gestionnaire dexception, elle constitue forcément la dernière clause catch. La clause catch(System.Exception) rattrape toutes les exceptions puisque toutes les classes dexception dérivent de la classe System.Exception. Si elle est présente dans un gestionnaire dexception, elle constitue forcément la dernière clause catch. Exceptions

48 Introduction à C#48 Exceptions propriétaires Le framework.NET définit de nombreuses exceptions mais vous pouvez définir vos propres classes dexceptions (qui doivent elles aussi dériver de la classe ). Le framework.NET définit de nombreuses exceptions mais vous pouvez définir vos propres classes dexceptions (qui doivent elles aussi dériver de la classe System.Exception ). Exceptions using System; public class ExceptionArgEntierHorsLimite : Exception{ public ExceptionArgEntierHorsLimite( int Entier, int Inf, int Sup ): base(string.Format("L'argument {0} est hors de l'intervalle [{1},{2}]", Entier,Inf,Sup)){} } class Prog{ static void f(int i) {if( i 50 )throw new ExceptionArgEntierHorsLimite(i,10,50);} public static void Main() { try{f(60);} catch(ExceptionArgEntierHorsLimite e) {Console.WriteLine("Exception: "+e.Message);} }

49 Introduction à C#49 Plan Eléments de base Eléments de base Structures de contrôle Structures de contrôle Classes & objets Classes & objets Héritage, polymorphisme & interfaces Héritage, polymorphisme & interfaces Exceptions Exceptions Autres éléments de C# Autres éléments de C#

50 Introduction à C#50 Les tableaux C# permet la création et lutilisation de tableaux à une ou plusieurs dimensions. C# permet la création et lutilisation de tableaux à une ou plusieurs dimensions. Les types de tableaux sont tous des types référence. En fait chaque type de tableau est une classe qui hérite de la classe abstraite. Les types de tableaux sont tous des types référence. En fait chaque type de tableau est une classe qui hérite de la classe abstraite System.Array. C# oblige tous les éléments dun tableau à avoir le même type. Cette contrainte peut être facilement contournée. Il suffit de spécifier que les éléments sont des références vers une classe de base, pour quen fait, chaque élément puisse être une référence vers un objet de nimporte quelle classe dérivée. C# oblige tous les éléments dun tableau à avoir le même type. Cette contrainte peut être facilement contournée. Il suffit de spécifier que les éléments sont des références vers une classe de base, pour quen fait, chaque élément puisse être une référence vers un objet de nimporte quelle classe dérivée. Autres éléments de C# int [] r1; // r1 est une référence vers un tableau d'entiers de dimension 1 int [,] r2; // r2 est une référence vers un tableau d'entiers de dimension 2 double [,,,] r4;//r4 est une référence vers un tableau de doubles dimension 4

51 Introduction à C#51 Le mot clé lock Le langage C# présente le mot-clé lock qui remplace élégamment lutilisation des méthode et de la classe qui définissent une section critique (i.e une portion de code accessible par un seul thread à la fois). Le langage C# présente le mot-clé lock qui remplace élégamment lutilisation des méthode Enter() et Exit() de la classe System.Threading.Monitor qui définissent une section critique (i.e une portion de code accessible par un seul thread à la fois). Autres éléments de C# lock( typeof(Prog) ) { Compteur*=Compteur; } try { Monitor.Enter( typeof(Prog) ); Compteur*=2; } finally { Monitor.Exit( typeof(Prog) ); }

52 Introduction à C#52 Le préprocesseur Toute compilation dun fichier source est précédée d'une phase de mise en forme du fichier. Celle-ci est effectuée par un préprocesseur. Toute compilation dun fichier source est précédée d'une phase de mise en forme du fichier. Celle-ci est effectuée par un préprocesseur. Il n'effectue que des traitements simples de manipulation textuelle. En aucun cas le préprocesseur n'est chargé de la compilation. Il n'effectue que des traitements simples de manipulation textuelle. En aucun cas le préprocesseur n'est chargé de la compilation. Toutes les directives préprocesseur sont précédées par le caractère #. Le préprocesseur reconnaît les directives suivantes : Toutes les directives préprocesseur sont précédées par le caractère #. Le préprocesseur reconnaît les directives suivantes : #define #undef #if #elif #else #endif #error #warning #line #region #endregion Autres éléments de C#

53 Introduction à C#53 Les délégués et les évènements C# permet la création de classes particulières avec le mot-clé delegate en post-fixe. On appelle ces classes délégations. Les instances des délégations sont appelées délégués. C# permet la création de classes particulières avec le mot-clé delegate en post-fixe. On appelle ces classes délégations. Les instances des délégations sont appelées délégués. Conceptuellement, un délégué est une référence vers une ou plusieurs méthodes (statiques ou non). On peut donc appeler un délégué avec la même syntaxe que lappel dune méthode. Ceci provoque lappel des méthodes référencées. Conceptuellement, un délégué est une référence vers une ou plusieurs méthodes (statiques ou non). On peut donc appeler un délégué avec la même syntaxe que lappel dune méthode. Ceci provoque lappel des méthodes référencées. La notion dévénement utilise les délégués pour stocker les méthodes à appeler lorsque lévénement est déclenché. La notion dévénement utilise les délégués pour stocker les méthodes à appeler lorsque lévénement est déclenché. Autres éléments de C#

54 Introduction à C#54 Surcharge des opérateurs C# permet la surcharge dopérateurs dans des classes: C# permet la surcharge dopérateurs dans des classes: Les opérateurs arithmétiques: Les opérateurs arithmétiques: unaires: unaires: + - ! ~ binaires: binaires: + - * / % & | ^ > Les opérateurs de conversion de type (appelés aussi opérateurs de transtypage. Les opérateurs de conversion de type (appelés aussi opérateurs de transtypage. Les opérateurs de comparaison: Les opérateurs de comparaison: == != = Autres éléments de C#

55 Introduction à C#55 Mode non protégé (1/2) Le CLR soccupe entièrement de la gestion de la mémoire (ramasse-miettes, allocations…) Le CLR soccupe entièrement de la gestion de la mémoire (ramasse-miettes, allocations…) Mode non protégé = possibilité de désactiver momentanément la gestion de la mémoire par le CLR Mode non protégé = possibilité de désactiver momentanément la gestion de la mémoire par le CLR Une conséquence: En mode protégé on peut utiliser des pointeurs Une conséquence: En mode protégé on peut utiliser des pointeurs Autres éléments de C#

56 Introduction à C#56 Mode non protégé (2/2) Exemple dutilisation: traitement dimages Mode géré... for( int y=0 ; yR=(byte)(255 - pCurrent->R); pCurrent->G=(byte)(255 - pCurrent->G); pCurrent->B=(byte)(255 - pCurrent->B); pCurrent++ ; }... Facteur = x 97 Autres éléments de C#

57 Introduction à C#57 Question? Mots clés : espace de noms ; point dentrée ; documentation automatique ; POO ; classe ; structure ; membre dune classe ; instance dune classe ; champ ; méthode ; propriété ; indexeur ; événement ; encapsulation ; niveau de visibilité ; constructeur ; destructeur ; IDisposable ; membres statiques ; mot-clé this ; héritage ; classe de base ; super-classe ; classe dérivée ; UML ; méthode virtuelle ; polymorphisme ; classe abstraite ; méthode abstraite ou virtuelle pure ; interface ; mot-clé is et as ; exceptions ; tableau ; mot- clé lock ; section critique ; préprocesseur ; délégation ; délégué ; mode non protégé ; mot-clé unsafe Mots clés : espace de noms ; point dentrée ; documentation automatique ; POO ; classe ; structure ; membre dune classe ; instance dune classe ; champ ; méthode ; propriété ; indexeur ; événement ; encapsulation ; niveau de visibilité ; constructeur ; destructeur ; IDisposable ; membres statiques ; mot-clé this ; héritage ; classe de base ; super-classe ; classe dérivée ; UML ; méthode virtuelle ; polymorphisme ; classe abstraite ; méthode abstraite ou virtuelle pure ; interface ; mot-clé is et as ; exceptions ; tableau ; mot- clé lock ; section critique ; préprocesseur ; délégation ; délégué ; mode non protégé ; mot-clé unsafe


Télécharger ppt "Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA © Patrick."

Présentations similaires


Annonces Google