.coin {
background-color:#E4EFFF;
border:1px solid #9FC6FF;
padding:5px;
/*arrondir les coins en haut à gauche et en bas à droite*/
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px;
font-family: ‘Trebuchet MS’, Verdana, sans-serif;
}
c#: Les classes
//
Définitions
De façon générale, chaque fichier « .cs » contient exactement une classe. De plus, chaque fichier porte le nom de la classe qu’il contient (mais cela n’est pas obligatoire comme dans certains langages).
La classe est l’élément central de tout programme C# (et de manière générale de tout programme.NET).
Tout doit en effet être regroupé dans une classe. Tout programme exécutable (exe) est constitué d’une ou plusieurs classes dont l’une comprend la fonction statique Main, point d’entrée duprogramme (qu’il s’agisse d’une application console ou Windows).
Toute librairie (dll pour Dynamic Link Libraries) est également composée d’une ou plusieurs classes. Nous avons d’ailleurs rencontré le mot class dans tous les programmes du chapitre 1, où il n’a pourtant jamais été question de classe.
C# version 2 (Visual Studio 2005) a introduit les classes partielles, les génériques, une nouvelle technique d’itérateurs, le type Nullable, l’opérateur : pour l’accès à l’espace de noms global, les classes statiques et la protection d’accès sur les accesseurs de propriétés.
C# version 3 (Visual Studio 2008) a introduit les initialisations à partir des propriétés, le type var, les classes anonymes, les méthodes partielles et les expressions lambda.
C# version 4 (Visual Studio 2010) a introduit le type dynamic et ainsi le type « non typé », ce qui peut paraître contradictoire mais ouvre des perspectives, notamment d’interfaçage avec des langages non typés.
C# version 5 (Visual Studio 2012) cette version permet de programmer plus simplement des programmes asynchrones grâce à l’ajout des mots clés async et await.
C# version 6 (Visual Studio 2013) l’arrivée des constructeurs primaires.
C# version 7 (Visual Studio 2015) .
Types de classes en C # .Net:
Les classes abstraites (Abstract Class (somtimes called a Pure Virtual Class))
Partial Class
Sealed Class
Static Class
Les classes abstraites
Le modificateur abstract indique que l’élément en cours de modification a une implémentation manquante ou incomplète.
Le modificateur abstract peut être utilisé avec des classes, des méthodes, des propriétés, des indexeurs et des événements.
Utilisez le modificateur abstract dans une déclaration de classe pour indiquer qu’une classe est destinée à être uniquement une classe de base d’autres classes.
Les membres marqués comme abstraits, ou inclus dans une classe abstraite, doivent être implémenté par les classes qui dérivent de la classe abstraite.
Une classe abstraite est une classe particulière qui ne peut pas être instanciée. Concrètement, cela veut dire que nous ne pourrons pas utiliser l’opérateur new.
De la même façon, une méthode abstraite est une méthode qui ne contient pas d’implémentation, c’est-à-dire pas de code.
Une classe abstraite est une classe dont toutes les méthodes n’ont pas été implémentées.
Elle n’est donc pas instanciable, mais sert avant tout à factoriser du code.
Une classe qui hérite d’une classe abstraite doit obligatoirement implémenter les méthodes manquantes (qui ont été elles-mêmes déclarées «abstraites» dans la classe parente). En revanche, elle n’est pas obligée de réimplémenter les méthodes déjà implémentées dans la classe parente (d’où une maintenance du code plus facile).
Les classes abstraites présentent les fonctionnalités suivantes :
Une classe abstraite ne peut pas être instanciée.
Une classe abstraite peut contenir des méthodes abstraites et des accesseurs.
Il est impossible de modifier une classe abstraite à l’aide du modificateur sealed (référence C#) car les deux modificateurs ont des significations opposées.
Le modificateur sealed empêche une classe d’être héritée et le modificateur abstract requiert qu’une classe soit héritée.
Une classe non abstraite dérivée d’une classe abstraite doit inclure des implémentations réelles de tous les accesseurs et méthodes abstraites hérités.
Pourquoi les classes abstraites ?
Lors de la conception d’une hiérarchie, on a besoin de créer des classes plus générales d’abord et différer l’implémentation à des étapes plus éloignées quand le comportement est très bien défini.
Quand on parle de figure géométrique, il est trop vague pour savoir comment calculer un périmètre, une surface : ces méthodes sont encore abstraites. Il est impossible de réaliser (implémenter) ces méthodes.
Par contre, un rectangle est une figure géométrique dont le calcul du périmètre et de la surface est connu, on peut alors implémenter ces méthodes qui sont très concrètes (pas du tout abstraites) pour un rectangle.
Exemple
using System;
abstract class FigureGeo
{ public abstract double Perimetre();
public abstract double Surface();
public override string ToString(){
return string.Format("\nPerimetre : {0, 7:F2}, Surface :
{1, 7:F2}", Perimetre(),Surface());
}
}
/* Cette classe est CONCRÈTE car toutes les méthodes
sont implénentées (réalisables)
*/
Exemple
class Cercle : FigureGeo
{ private double rayon;
public Cercle(double rayon) {
this.rayon = rayon;
}
public override double Perimetre() {
return 2 * Math.PI * rayon;
}
public override double Surface() {
return Math.PI * rayon * rayon;
}
public override string ToString() {
return "Cercle de rayon : " + rayon +
base.ToString();
}
}
/* Cette classe est encore abstraite car on ne sait
pas encore comment calculer la Surface.
Exemple
abstract class Parallelogramme: FigureGeo
{ protected double cote1, cote2;
// on a quand même le droit d'avoir de constructeur
public Parallelogramme(double cote1, double cote2)
{
this.cote1 = cote1;
this.cote2 = cote2;
}
// cette méthode est "concrète" ici:
public override double Perimetre() {
return 2 * (cote1+cote2);
}
public override string ToString() {
return "Les 2 cotes : " + cote1 + ", " + cote2
+ "\n" + base.ToString();
}
}
/* Cette classe est CONCRÈTE car toutes les méthodes
sont implémentées (réalisables)
*/
class Rectangle
: Parallelogramme
{
public Rectangle(double longueur, double largeur) :
base(longueur, largeur)
{
}
public override double Surface() {
return cote1*cote2;
}
public override string ToString()
{
return "En tant qu'un rectangle : " + base.ToString();
}
}
class Abstraite1
{
static void Main (string[] args)
{
Cercle c = new Cercle(10.0);
Console.WriteLine(c);
Rectangle r = new Rectangle(6.8, 3.2);
Console.WriteLine("Infos du rectangle r :\n" + r);
}
}
/* Exécution:
Cercle de rayon : 10
Perimetre : 62,83, Surface : 314,16
Infos du rectangle r :
En tant qu'un rectangle : Les 2 cotes : 6,8, 3,2
Perimetre : 20,00, Surface : 21,76
Press any key to continue
Remarques:
On n’a pas le droit d’instancier (avec new) un objet d’une classe abstraite;
Une classe abstraite peut contenir des méthodes non abstraites;
Une classe abstraite peut contenir des constructeurs pour faire appeler par ses classes dérivées ( avec base(. . .))
Une méthode abstraite est automatiquement virtuelle (mais on n’a pas le droit de fournir ce mot virtual sur l’en-tête). Ces méthodes abstraites peuvent être toutes ou en partie redéfinies (override) dans une classe dérivée.
Les classes partielles
Source:MSDN
Dans C#, vous pouvez créer une classe (la même classe) dans différents fichiers. Ceci signifie que vous pouvez commencer une classe dans un fichier et la continuer dans un autre fichier ou dans d’autres fichiers. Ceci est désigné sous le nom de exécution partielle.
Il est possible de fractionner la définition d’une classe ou d’un struct, ou d’une interface ou d’une méthode sur deux fichiers sources ou plus. Chaque fichier source contient une section de la définition de type ou de méthode, et toutes les parties sont combinées lorsque l’application est compilée.
Il est souhaitable de fractionner une définition de classe dans plusieurs situations :
Dans le cadre de projets volumineux, la répartition d’une classe en plusieurs fichiers distincts permet à plusieurs programmeurs d’y travailler simultanément.
Lorsque vous travaillez avec une source générée automatiquement, le code peut être ajouté à la classe sans qu’il soit nécessaire de recréer le fichier source. Visual Studio utilise cette approche lors de la création de formulaires Windows Forms, de code wrapper de service Web, etc. Vous pouvez créer un code qui utilise ces classes sans avoir à modifier le fichier créé par Visual Studio.
Pour fractionner une définition de classe, utilisez le modificateur de mot clé partial, comme indiqué ici :
public partial class Employee
{
public void FaireTravail()
{
}
}
public partial class Employee
{
public void AllerDiner()
{
}
}
Le mot clé partial indique que d’autres parties de la classe, du struct ou de l’interface peuvent être définies dans l’espace de noms.
Toutes les parties doivent utiliser le mot clé partial.
Toutes les parties doivent être disponibles lors de la compilation pour former le type final.
Toutes les parties doivent avoir la même accessibilité : public, private, etc.
Si une partie est déclarée comme abstract, l’ensemble du type est considéré comme abstract.
Si une partie est déclarée comme sealed, l’ensemble du type est considéré comme sealed.
Si une partie déclare un type de base, l’ensemble du type hérite de cette classe.
Exemple:
Dans l’exemple suivant, les champs et le constructeur de la classe, CoOrds, sont déclarés dans une définition de classe partielle, et le membre, PrintCoOrds, est déclaré dans une autre définition de classe partielle.
public partial class CoOrds
{
private int x;
private int y;
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
}
public partial class CoOrds
{
public void PrintCoOrds()
{
Console.WriteLine("CoOrds: {0},{1}", x, y);
}
}
class TestCoOrds
{
static void Main()
{
CoOrds myCoOrds = new CoOrds(10, 15);
myCoOrds.PrintCoOrds();
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: CoOrds: 10,15
Exercice d’application:
Ouvrir Microsoft Visual C# et créez une application de console appelée TpClassePartielle
Ajoutez un fichier source
Cliquez avec le bouton droit de votre sourie sur TpClassePartielle dans l’Explorateur de solution.
Cliquez sur nouvel élément.
Dans les modèles énumérés, sélectionnez le fichier de code.
Nommez le fichier de code “CircleA”.
Cliquez sur le bouton ajouter.
Copiez le code suivant et le collez dans votre fichier
public partial class Cercle
{
private double _rayon;
public double Rayon
{
get { return (this._rayon <= 0) ? 0.00 : this._rayon; }
set { this._rayon = value; }
}
public double Diametre
{
get { return this.Rayon * 2; }
}
public double Circonference
{
get { return Diametre * 3.14159; }
}
public double Surface
{
get { return this.Rayon * this.Rayon * 3.14159; }
}
}
Créez un deuxième fichier de type fichier de code et le nommez “CercleB” fichier
Copiez le code suivant et le collez dans votre fichier
using System;
public partial class Cercle
{
public Cercle()
{
this.Rayon = 0.00;
}
public Cercle(double rayon)
{
this.Rayon = rayon;
}
public void Present()
{
Console.WriteLine("Rayon: {0}", this.Rayon);
Console.WriteLine("Diamètre: {0}", this.Diametre);
Console.WriteLine("Circonférence: {0}", this.Circonference);
Console.WriteLine("Surface: {0}", this.Surface);
}
}
Maintenant il ne vous reste que le changement de votre classe program et votre méthode main pour exécuter vos classes récemment crées
Copiez le code suivant et le collez dans votre fichier
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TpClassePartielle
{
class Program
{
static Cercle Initialize()
{
Console.Write("Entrez le rayon de votre cercle: ");
double ray = double.Parse(Console.ReadLine());
Cercle c = new Cercle(ray);
return c;
}
static int Main()
{
Console.WriteLine(
"Bienvenue dans apcpedagogie votre site d'autoformation\n==============================");
Console.WriteLine(
"Cette application vous permet de traiter un cercle");
Cercle circ = Initialize();
Console.WriteLine("\n==============================");
Console.WriteLine("Caractéristiques de votre cercle en cm");
Console.WriteLine("------------------------------");
circ.Present();
Console.WriteLine("==============================\n");
Console.ReadLine();
return 0;
}
}
}
Vous obtiendrez le résultat suivant:
Créez deux autres fichiers cylindreA et cylindreB comme vous l’avez fait pour les cercles
public partial class Cercle
{
private double _rayon;
public double Rayon
{
get { return (this._rayon <= 0) ? 0.00 : this._rayon; }
set { this._rayon = value; }
}
public double Diametre
{
get { return this.Rayon * 2; }
}
public double Circonference
{
get { return Diametre * 3.14159; }
}
public double Surface
{
get { return this.Rayon * this.Rayon * 3.14159; }
}
}
Même chose pour cylindreB
using System;
public partial class Cylindre : Cercle
{
// Ceci est le constructeur par défaut du cylindre
// Ce constructeur suppose que nous ne disposons pas de dimension
public Cylindre()
{
this.Rayon = 0.00;
}
// Ce constructeur suppose qu'il existe un rayon
// Le rayon aurait pu être spécifié sur un cercle de parent
public Cylindre(double hauteur)
{
this.Hauteur = hauteur;
}
// Ce constructeur peut être utilisé pour spécifier
// le rayon de la base et la hauteur du volume
// Le rayon peut également avoir été définie par un cercle de parent
public Cylindre(double rayon, double hauteur)
{
this.Rayon = rayon;
this.Hauteur = hauteur;
}
new public void Present()
{
Console.WriteLine("Hauteur: {0}", this.Hauteur);
Console.WriteLine("Surface Latéral: {0}", this.SurfaceLateral);
Console.WriteLine("Surface totale: {0}", this.SurfaceTotale);
Console.WriteLine("Volume: {0}", this.Volume);
}
}
Enfin modifiez la classe program comme suit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TpClassePartielle
{
class Program
{
static Cercle Initialize()
{
Console.Write("Entrez le rayon de votre cercle: ");
double ray = double.Parse(Console.ReadLine());
Cercle c = new Cercle(ray);
return c;
}
static double ObtenezHauteur()
{
Console.Write("Entrer une hauteur: ");
double hgt = double.Parse(Console.ReadLine());
return hgt;
}
static int Main()
{
Console.WriteLine(
"Bienvenue dans apcpedagogie votre site d'autoformation\n==============================");
Console.WriteLine(
"Cette application vous permet de traiter un cylindre");
Cercle circ = Initialize();
double hauteur = ObtenezHauteur();
Cylindre cldr = new Cylindre(circ.Rayon, hauteur);
Console.WriteLine("\n================================");
Console.WriteLine("=//=Caractéristiques de cylindre=//=");
Console.WriteLine("================================");
Console.WriteLine(" =-= Caractéristiques de base =-=");
Console.WriteLine("--------------------------------");
circ.Present();
Console.WriteLine("------------------------------");
Console.WriteLine("=-= Caractéristiques de volume =-=");
cldr.Present();
Console.WriteLine("================================\n");
/*Console.WriteLine("\n==============================");
Console.WriteLine("Caractéristiques de votre cercle en cm");
Console.WriteLine("------------------------------");
circ.Present();
Console.WriteLine("==============================\n");*/
Console.ReadLine();
return 0;
}
}
}
Vous obtiendrez le résultat suivant:
Les classes scellés(sealed)
Une classe scellée est une classe dont il est impossible d’hériter.
Il est possible que vous n’ayez pas envie que quelqu’un développe une classe héritant d’une classe vous appartenant. Dans ce cas, vous dev
rez déclarer cette classe comme scellée.
Vous pouvez faire cela grâce au mot-clé sealed (équivalent de final en Java). Le code suivant vous montre un exemple de classe scellée :
sealed class ClasseScellee {
}
.
Le modificateur scellé est utilisé pour empêcher la dérivation d’une classe. Une erreur se produit si une classe scellée est spécifié comme la classe de base d’ une autre classe.
class ClasseDerivee : ClasseScellee {
}
.
Retenir 1. Une classe, ce qui limite l’héritage pour des raisons de sécurité est déclarée, classe scellée. 2. classe Sealed est la dernière classe dans la hiérarchie. 3. classe scellée peut être une classe dérivée, mais ne peut pas être une classe de base. 4. Une classe scellée ne peut pas être aussi une classe abstraite. Parce que la classe abstraite doit fournir la fonctionnalité d’héritage.
Les classes statiques
Une classe statique ne peut comporter que des champs et méthodes statiques.
Une classe statique ne peut servir de classe de base pour l’héritage.
Une classe statique ne peut être instanciée.
Une classe statique ne peut pas être instanciée, vous ne pouvez pas utiliser le mot clé new pour créer une variable du type classe.
Une classe statique peut être utilisée comme conteneur commode pour les ensembles de méthodes qui opèrent simplement sur des paramètres d’entrée et n’ont pas à obtenir ou définir de champs d’instance internes.
La classe suivante est déclarée comme statique et contient uniquement des méthodes statiques:
CompanyEmployee de classe statique
{
DoSomething public static void () {} /*...*/
public static void DoSomethingElse () {} /*...*/
}
Les objets et les classes
Un objet ne désigne rien d’autre qu’une variable d’une classe donnée (on dit aussi d’un type donné).
On parle aussi d’instance (à la place d’objet) et d’instanciation d’une classe donnée, pour l’opération de création d’un objet. L’objet est donc de l’ordre du concret : il occupe de la mémoire au moment d’exécuter le programme (nous allons bientôt expliciter cette occupation mémoire).
À une même classe peut correspondre plusieurs objets (autrement dit plusieurs variables).
Au moment d’exécuter le programme, les différents objets occupent des zones de mémoire distinctes. À ce moment, la classe, elle, n’occupe aucune zone de mémoire : il s’agissait d’une information à l’usage du compilateur.
Un objet est une instance d’une classe, on crée un nouvel objet à partir d’une classe
Sachant qu’un objet en programmation c’est comme un objet du monde réel mais ce n’est pas forcément restreint au matériel. Un chien est un objet.
Des concepts comme l’amour ou une idée sont également des objets, tandis qu’on ne dirait pas cela dans le monde réel.
les classes permettent de décrire les attributs et les opérations qui sont associés à un objet. Par l’exemple, l’objet Personne peut contenir :
• Nom, Prénom, Age et Sexe comme attributs,
• Marcher(), Manger(), Courir(), PasserLaTondeuse()
comme opérations.
Une classe peut être vue comme un « moule » permettant de fabriquer des « instances » d’un objet. Par exemple, les
personnes « Mohamed » et « Ahmed » sont des instances de la classe Personne précédemment décrite.
Les termes classe et objet sont parfois employés indifféremment, mais en réalité, les classes décrivent le type des objets, alors que ces derniers sont des instances utilisables de classes.
Ainsi, l’opération de création d’un objet est appelée instanciation.
Si l’on reprend l’analogie avec un plan de construction, une classe est un plan, et un objet est un bâtiment construit à partir de ce plan.
classe: Plan —–instanciation——-> Objet: bâtiment
Déclarer et instancier des classes
Les classes sont déclarées à l’aide du mot clé class, comme illustré dans l’exemple suivant :
public class Personne
{
//Constructeurs,Destructeurs,Constantes,Champs,Méthodes,Propriétés,Indexeurs,Opérateurs
//,Événements,Délégués,Classes,Interfaces,Structures...
}
Le mot clé class est précédé par le niveau d’accès.
public étant utilisé dans ce cas, n’importe qui peut créer des objets à partir de cette classe. Le nom de la classe suit le mot clé class.
Le reste de la définition est le corps de la classe, où le comportement et les données sont définis.
Les champs, propriétés, méthodes et événements d’une classe sont désignés collectivement par le terme membres de classe.
Les membres d’une classe
Les classes et structs ont des membres qui représentent leurs données et comportement.
Les membres d’une classe incluent tous les membres déclarés dans la classe, avec tous les membres déclarés dans toutes les classes dans leur hiérarchie d’héritage.Les membres privés dans les classes de base sont hérités mais ne sont pas accessibles à partir de classes dérivées.
Exercices de simulation
Exercice apcpedagogieClasses001
Ouvrir Microsoft Visual C# et créez une application de console appelée TpClasseApprenant
Créer la classe Article caractérisée par les attributs : NumCin, Nom, Prenom, DateNaissance.
Ces attributs doivent seulement être accessibles par le biais des accesseurs (get / set) en lecture/écriture mis en œuvre par les propriétés.
Ajouter les constructeurs suivants :
Un constructeur par défaut
Un constructeur initialisant tous les attributs.
Un Constructeur qui permet de renseigner la NumCin , le Nom et le Prenom lors de l’instanciation
Un constructeur de recopie
Ajouter la méthode AfficherApprenant() qui affiche les informations de l’apprenant.
Pour offrir les meilleures expériences, nous utilisons des technologies telles que les cookies pour stocker et/ou accéder aux informations des appareils. Le fait de consentir à ces technologies nous permettra de traiter des données telles que le comportement de navigation ou les ID uniques sur ce site. Le fait de ne pas consentir ou de retirer son consentement peut avoir un effet négatif sur certaines caractéristiques et fonctions.
Fonctionnel
Toujours activé
Le stockage ou l’accès technique est strictement nécessaire dans la finalité d’intérêt légitime de permettre l’utilisation d’un service spécifique explicitement demandé par l’abonné ou l’utilisateur, ou dans le seul but d’effectuer la transmission d’une communication sur un réseau de communications électroniques.
Préférences
Le stockage ou l’accès technique est nécessaire dans la finalité d’intérêt légitime de stocker des préférences qui ne sont pas demandées par l’abonné ou l’utilisateur.
Statistiques
Le stockage ou l’accès technique qui est utilisé exclusivement à des fins statistiques.Le stockage ou l’accès technique qui est utilisé exclusivement dans des finalités statistiques anonymes. En l’absence d’une assignation à comparaître, d’une conformité volontaire de la part de votre fournisseur d’accès à internet ou d’enregistrements supplémentaires provenant d’une tierce partie, les informations stockées ou extraites à cette seule fin ne peuvent généralement pas être utilisées pour vous identifier.
Marketing
Le stockage ou l’accès technique est nécessaire pour créer des profils d’utilisateurs afin d’envoyer des publicités, ou pour suivre l’utilisateur sur un site web ou sur plusieurs sites web ayant des finalités marketing similaires.