POO – C# C# / .Net / ASP.NET 5 Hervé PHILIPPE Promotion 2015-2016 http://DevLab.Alsace Plan Langages informatiques Typage Paradigmes de programmation Evolution actuelle POO Encapsulation Héritage Polymorphisme C# Générialités http://DevLab.Alsace Langages informatiques http://DevLab.Alsace Langages informatiques Typage • Typage statique/dynamique • • • • Typage statique, à la base du langage C (et dérivés) Typage dynamique, à la base du JavaScript Besoins de typage statique pour de grosses applications Besoins de typage dynamique principalement pour l’IA • Typage faiblement/fortement typé • Définition assez subjective… • Typage fort : garantir la cohérence des données sans conversion implicite http://DevLab.Alsace Langages informatiques Paradigmes Programmation impérative Principe : ne pas utiliser de branchements ("goto"). Exemple : langage C http://DevLab.Alsace Langages informatiques Paradigmes Programmation impérative Principe : ne pas utiliser de branchements ("goto"). Exemple : langage C Programmation orientée objet Terme usuel pour la programmation orientée classe (C++, Java, C#...) http://DevLab.Alsace Langages informatiques Paradigmes Programmation impérative Principe : ne pas utiliser de branchements ("goto"). Exemple : langage C Programmation orientée objet Terme usuel pour la programmation orientée classe (C++, Java, C#...) Programmation fonctionnelle Un programme est une fonction au sens mathématique du terme http://DevLab.Alsace Langages informatiques Paradigmes Programmation impérative Principe : ne pas utiliser de branchements ("goto"). Exemple : langage C Programmation orientée objet Terme usuel pour la programmation orientée classe (C++, Java, C#...) Programmation fonctionnelle Un programme est une fonction au sens mathématique du terme Autres : Programmation concurrentielle Notions de processus (thread) et d’asynchrone Programmation événementielle http://DevLab.Alsace Langages informatiques Evolution actuelle • Les langages à typage dynamique s’enrichissent avec du typage statique Ex: JavaScript -> TypeScript, Flow (Facebook), PHP -> Hack (Facebook) • Et vice-versa ! Ex: C# http://DevLab.Alsace Langages informatiques Evolution actuelle • Les langages à typage dynamique s’enrichissent avec du typage statique Ex: JavaScript -> TypeScript, Flow (Facebook), PHP -> Hack (Facebook) • Et vice-versa ! Ex: C# • Les langages orientés objets s’enrichissent avec de la programmation fonctionnelle (lambda expressions) Ex: Java, C# • Et vice-versa ! Ex: JavaScript (ES2015), PHP 7 http://DevLab.Alsace POO http://DevLab.Alsace POO - Encapsulation • Rassembler dans une même structure : • Variables membres (données) • Méthodes (fonctions) • Garantir l’intégrité des données en : • Ne laissant visible que ce qui doit être réellement utilisé (visibilité) • N’accédant aux données que par des méthodes Classe = description abstraite d’un objet Instancier une classe = créer un objet sur son modèle (grâce au constructeur) Propriété = variable membre accessible par un getter et/ou setter http://DevLab.Alsace POO - Héritage • Classe qui hérite d’une autre classe La classe fille hérite des attributs et méthodes de la classe mère http://DevLab.Alsace POO - Héritage • Classe qui hérite d’une autre classe La classe fille hérite des attributs et méthodes de la classe mère • Attention à la visibilité des attributs/méthodes et celle des classes ! http://DevLab.Alsace POO - Héritage • Classe qui hérite d’une autre classe La classe fille hérite des attributs et méthodes de la classe mère • Attention à la visibilité des variables membres/méthodes et celle des classes ! • Pour éviter l’héritage multiple (comme en C++), des interfaces sont utilisées (Java, C#) http://DevLab.Alsace POO - Héritage • Classe qui hérite d’une autre classe La classe fille hérite des variables membres et méthodes de la classe mère • Attention à la visibilité des variables membres/méthodes et celle des classes ! • Pour éviter l’héritage multiple (comme en C++), des interfaces sont utilisées (Java, C#) • Une interface est la description d’un comportement Une classe l’implémente quand elle a besoin de ce comportement http://DevLab.Alsace POO - Héritage • Classe qui hérite d’une autre classe La classe fille hérite des variables membres et méthodes de la classe mère • Attention à la visibilité des variables membres/méthodes et celle des classes ! • Pour éviter l’héritage multiple (comme en C++), des interfaces sont utilisées (Java, C#) • Une interface est la description d’un comportement Une classe l’implémente quand elle a besoin de ce comportement • Une classe abstraite et une interface ne peuvent être directement instanciées http://DevLab.Alsace POO - Polymorphisme • Surcharge d’une fonction (overload) Même nom de fonction, paramètres différents float Additionner(float, int){} int Additionner(int, int){} http://DevLab.Alsace POO - Polymorphisme • Surcharge d’une fonction (overload) Même nom de fonction, paramètres différents float Additionner(float, int){} int Additionner(int, int){} • Spécialisation/redéfinition d’une fonction (override) Même nom de fonction, mêmes paramètres que celle de la classe parente http://DevLab.Alsace POO - Polymorphisme • Surcharge d’une fonction (overload) Même nom de fonction, paramètres différents float Additionner(float, int){} int Additionner(int, int){} • Spécialisation/redéfinition d’une fonction (override) Même nom de fonction, mêmes paramètres que celle de la classe parente • Généricité d’une classe (generics, template) Classe ayant un type comme paramètre class List<T> {...}; List<int> liste = new List<int>(); http://DevLab.Alsace Langage C# Introduction • Langage très complet, qui évolue constamment mais reste cohérent • Cours en ligne pour débuter : • Débuter en C# : https://openclassrooms.com/courses/apprenez-a-developper-en-c • C# avec la POO : https://openclassrooms.com/courses/programmez-en-oriente-objet-avec-c • ASP.NET MVC (mais pas avec la nouvelle version ASP.NET Core) : https://openclassrooms.com/courses/apprendre-asp-net-mvc • Microsoft Virtual Academy : https://mva.microsoft.com • Présentation ASP.NET 5 • Débuter avec C# partie 1 • Documentation C# et framework .NET : http://DevLab.Alsace https://msdn.microsoft.com/library Langage C# Généralités – Mots clés principaux • namespace : paquetage permettant de regrouper des classes • using : permet d’utiliser des paquetages • class / interface : servent à définir une classe ou une interface • Exemple d’héritage : class Voiture : Vehicule, IQuiRoule {…} • Constructeurs : méthode de même nom que la classe, sans valeur de retour http://DevLab.Alsace Langage C# Généralités • Propriétés : permet d’accéder à une variable membre (lecture/écriture) • Avantage : permet d’ajouter un traitement à la lecture et/ou à l’écriture string name; • Syntaxe : private public string Name { get { return this.name; } set { this.name = value; } } http://DevLab.Alsace Langage C# Généralités • Propriétés : permet d’accéder à une variable membre (lecture/écriture) • Avantage : permet d’ajouter un traitement à la lecture et/ou à l’écriture private string name; public string Name • Syntaxe : { get { return this.name; } set { public string Name { get; set; } this.name = value; } } • Instanciation simplifiée : Voiture ma_voiture = new Voiture {Couleur = "rouge"}; http://DevLab.Alsace Langage C# Généralités • Parcours d’une liste avec le mot clé « foreach » • Dictionnaires : listes de clés/valeurs Ex. : ViewData["ReturnUrl"] = returnUrl; • Listes génériques : listes de types d’objets qu’on définit dans la déclaration Ex.: http://DevLab.Alsace List<Voiture> liste_de_voitures = new List<Voiture>(); Langage C# Généralités • Attributs : permet d’ajouter des précisions sur tout type de déclaration Exemple : [HttpGet] [AllowAnonymous] public IActionResult Login(string returnUrl = null) {…} • Delegate = variable qui pointe sur une méthode • Lambda expressions : syntaxe simplifiée permettant de créer des méthodes anonymes Exemple : private delegate void DelegateTri(int[] tableau); DelegateTri tri = delegate(int[] leTableau) { Array.Sort(leTableau); }; http://DevLab.Alsace private delegate void DelegateTri(int[] tableau); DelegateTri tri = (leTableau) => { Array.Sort(leTableau); }; Langage C# Bonnes pratiques • Les classes, les interfaces, les méthodes et les propriétés commencent par une majuscule • Les variables commencent par une minuscule • Les variables membres commencent par un « m » minuscule suivi d’une majuscule • Les interfaces commencent par un « I » majuscule suivi d’une autre majuscule • 1 fichier par classe/interface http://DevLab.Alsace Langage C# Exercice 1 • Créer les classes : • Animal : • Propriétés : pelage poils/plumes, largeur, longueur, hauteur… • Actions (afficher un texte pour chaque action) : dormir, manger… • Chat (un chat est un animal) • Propriétés : race, caractère… • Actions : sauter, marcher… • Oiseau (un oiseau est un animal) • Propriétés : espère, envergure… • Actions : voler, picorer… • Instancier : • Un chat roux • Un canari http://DevLab.Alsace Langage C# Exercice 2 Mais… un oiseau peut (éventuellement) marcher et une poule ne peut pas voler ! • Intégrer, dans votre modèle objet, les interfaces : • Marcher • Voler • Créer les classes : • OiseauQuiMarche • OiseauQuiVole • Instancier : • Une poule • Un canari http://DevLab.Alsace Langage C# Exercice 3 • Créer une liste d’animaux (chats, oiseaux…) • Parcourir cette liste pour : • Appeler la méthode « Voler » quand l’animal peut voler • Appeler la méthode « Marcher » quand l’animal peut marcher http://DevLab.Alsace