Programmation .Net - Indépendance financière

Classes et programmation orientée objet en Visual Basic/C#

Ce tutoriel n’est pas qu’important, il l’est à un tel point qu’il comportera plusieurs parties. De plus, il sera en C# et en Visual Basic en même temps. Il y aura donc 2 tutoriels associés à celui-ci sur Youtube. Pourquoi? Parce que l’orienté objet et les classes sont des sujets de premier plan en programmation moderne, il est donc nécessaire d’y consacrer plus de temps.

Les objets

Pratiquement tout est un objet en Visual Basic/C#. En effet, nous en avons même utilisé tout au long des derniers tutoriels sans même le savoir! Il est possible de comparer les langages de programmation à des techniques de travail, les objets (classes) à des outils et le .Net Framework à notre (gros) coffre à outils. Qu’est-ce que le .Net Framework? C’est un amalgame de classes fourni par Microsoft afin de nous éviter de réinventer la roue à chaque fois que l’on code. Il contient notamment toutes les Collections, les classes String, Decimal, Int32, etc, les classes d’accès aux fichiers, bref pratiquement tout ce que l’on a besoin pour communiquer avec Windows.

Les classes

On peut considérer les classes comme des plans (blueprints) d’objets, par exemple un plan pour la construction d’un avion. On comprend donc comment construire l’objet mais pas l’objet lui-même. Gardez cela en tête pour les prochains exemples.

Une classe peut contenir les éléments suivants:
– Constructeur(s)
– Paramètre(s)
– Membre(s)
– Méthode(s)
– Méthode(s) et paramètre(s) hérité(s) (comme ToString())

Il est possible que vous ne soyez pas familiés avec tout ces concepts, nous allons donc les voir un par un plus ou moins en détails dans ce tutoriel. Nous compléterons avec les tutoriels suivants.

La première étape est de créer une nouvelle classe pour regarder la structure.

1. Créer un nouveau projet de type Console, cliquer droit sur le projet dans le Solution Explorer;

2. Passer votre souris sur Add -> cliquer sur New Item;

3. Selectionner Class et donner-lui le nom: Car (voiture en anglais).

Note : étant donné la nature anglophone du langage en général, nous allons tendre vers l’anglais pour certaines pratiques et nomenclatures.

Visual Basic

Car class

C#

CSharp new item

Une classe vide telle que celle ci-dessous sera générée.

Visual Basic

Public Class Car

End Class

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassesCSharp
{
    public class Car
    {

    }
}

Cette classe agîra comme notre plan d’une voiture pour lorsque l’on voudra créer de vrais objets en mémoire.

Constructeur

Un constructeur défini une façon initiale de contruire un objet. Il est aussi possible d’en avoir plusieurs pour une seule classe. Il est important de garder en tête qu’un constructeur est un peu spécial car ce sera le premier élément à être exécuter au moment où l’objet deviendra réel. De plus, celui-ci portera le nom de la classe elle-même en C# et le nom New en Visual Basic. Voici la structure de base de notre constructeur pour la classe Car :

Visual Basic

Public Class Car
    'Constructeur
    Public Sub New()

    End Sub
End Class

C#

namespace ClassesCSharp
{
    public class Car
    {
        //Constructeur
        public Car()
        {

        }
    }
}

Nous ne mettrons rien dans le constructeur pour le moment.

Les paramètres (Propriétés)

Les paramètres sont des variables accessibles de l’extérieur de la classe et oui, une classe est comme une genre de boîte renfermant certains éléments accessibles de l’extérieur et d’autres non. Ces privilèges sont gérés par les mots-clés Private et Public. On peut en faire la comparaison avec une perceuse. Cette dernière vous donne la possibilité d’utiliser le bouton de perçage ainsi que le bouton pour changer de direction, toutefois vous ne pouvez pas accéder au méchanisme à l’intérieur sauf pour les caractèristiques de bases comme la rapidité, le voltage etc. Cette information peut être comparée aux paramètres.

Pour notre exemple, nous allons ajouter les paramètres IsStarted et PaintColor. Rappelez-vous que les paramètres composes des états et non des actions. Pour les paramètres que l’on souhaite lire, donc rendre accessibles de l’extérieur, on utilisera le mot clé Get et pour ceux que l’on souhaite rendre accessibles à l’écriture, on utilisera le mot clé Set. Donc avec Get, on peut lire une valeur de l’extérieur et avec Set on peut la modifier. Voici le code correspondant :

Visual Basic

Public Class Car
    'Membres privés
    Private _PaintColor As String
    Private _IsStarted As Boolean

    'Paramètres (Propriétés)
    Public Property PaintColor As String
        Get
            Return _PaintColor
        End Get
        Set(value As String)
            _PaintColor = value
        End Set
    End Property
    Public Property IsStarted As Boolean
        Get
            Return _IsStarted
        End Get
    End Property

    'Constructeur
    Public Sub New()

    End Sub
End Class

C#

namespace ClassesCSharp
{
    public class Car
    {
        //Membres privés
        private string _PaintColor;

        public string PaintColor
        {
            get
            {
                return _PaintColor;
            }
            set
            {
                _PaintColor = value;
            }
        }
        public bool IsStarted { get; private set; }

        //Constructeur
        public Car()
        {

        }
    }
}

Vous avez raison de vous demander d’où sort tout ce code, nous avons ajouté beaucoup de modificateurs et il existe effectivement plusieurs façons de créer des paramètres (ou propriétés en Visual Basic). Nous allons diviser le code en plusieurs parties pour mieux le comprendre.

Premièrement, la section des membres privés décrit des variables (normalement privées) utilisées dans la classe pour l’exécution de son processus. Rappelez-vous que ces variables sont accessibles par toutes les méthodes et paramètres de la classe elle-même. Il en reste donc que les paramètres sont théoriquement notre seule façon d’accéder à des variables à l’intérieur de la classe.

PaintColor peut être lue et écrite car elle possède un get et un set, elle est aussi déclarée comme public. Dans le get nous retournons la valeur de la variable privée _PaintColor et dans le set, nous assignons cette variable privée à value qui contiendra la valeur entrée par l’utilisateur. Si vous avez toujours de la difficulté à voir la différence entre un paramètre et un membre privé, dites-vous qu’un paramètre est plutôt comme une porte d’accès contrôlée aux variables privées. Le but est toujours de garder contrôle sur ce qui entre et sort de notre classe.

Voici deux façon de créer des paramètres (propriétés) dans une classe, la première est la version longue et la seconde est la version courte :

Visual Basic – version longue

    Private _PaintColor As String

    Public Property PaintColor As String
        Get
            Return _PaintColor
        End Get
        Set(value As String)
            _PaintColor = value
        End Set
    End Property

C# – Version longue

        private string _PaintColor;

        public string PaintColor
        {
            get
            {
                return _PaintColor;
            }
            set
            {
                _PaintColor = value;
            }
        }

Dans la version longue, il est nécessaire de faire la déclaration d’une variable privée associée si désiré, toutefois elle donne la possibilité d’interfacer une variable privée qui n’existe pas, nous verrons des exemples dans un futur tutoriel.

Visual Basic – Version courte

Public Property PaintColor As String

C# – Version courte

public string PaintColor { get; set; }

En contre partie, le désavantage de cette version courte est le fait qu’elle ne prenne pas en compte de corps de fonction, toutefois elle est plus rapide à déclarer et visuellement plus facile à lire. De plus, en C#, vous pouvez ajouter private devant get et/ou set pour empêcher un utilisateur du paramètre de lire et/ou écrire sur celui-ci.

Remarque : si vous utilisez la version longue, votre paramètre et votre variable privée doivent avoir le même type, par exemple dans le cas de PaintColor et _PaintColor, elles sont toutes les deux de type string.

La version final raccourcie est la suivante :

Visual Basic

Public Class Car
    'Paramètres (Propriétés)
    Public Property PaintColor As String
    Public Property IsStarted As Boolean

    'Constructeur
    Public Sub New()

    End Sub
End Class

C#

namespace ClassesCSharp
{
    public class Car
    {
        //Paramètres
        public string PaintColor { get; set; }
        public bool IsStarted { get; private set; }

        //Constructeur
        public Car()
        {

        }
    }
}

Vous pouvez remarquer que je n’ai même pas besoin de membres dans ce cas car j’utilise uniquement des paramètres rapides qui créent un variable locale implicitement.

En résumé, si vous voulez ajouter de la validation à l’entré de votre paramètre, vous devez déclarer un corps pour celui-ci, c’est-à-dire utiliser la version longue. Le private set; et private get; peuvent être utilisé pour empêcher à l’utilisateur de la classe d’avoir accès à la lecture ou à l’écriture du paramètre. Finalement, les paramètres devraient avoir des noms d’états comme par exemple IsActive, PaintColor, IsStarted, TopSpeed et autre.

Première tentative!

Ce que nous souhaitons faire ici est être certain que Visual Basic/C# puisse voir nos paramètres. Nous allons donc devoir créer ce que l’on appelle, une instance. Une instance consitue un objet réel créer à partir de la classe (plan/blueprint).

Voici comment procéder :

1. Retourner au fichier Program.vb/Program.cs dans la sub/fonction Main().

2. Déclarer une nouvelle variable nommée MyCar (ou le nom que vous préférez) de type Car.

Visual Basic

Visual Basic Car declaration and initialization

C#

C Sharp Declaration

Pourquoi y a-t-il un () à la fin de notre initialisation? Cette partie est en fait notre constructeur. Dans notre cas, ce dernier n’a aucun argument donc on inscrit simplement ().

Vous devriez maintenant être en mesure de voir les deux paramètres en utilisant le “.” après avoir écrit MyCar (ou autre nom de votre variable) sur la ligne suivante. Le point permet donc d’avoir accès aux méthodes et aux paramètres de l’objet en question.

Visual Basic

Visual Basic Car intellisense

C#

CSharp intellisense

Les membres

Les membres sont normalement privés donc ne peuvent pas être vus de l’extérieur par l’utilisateur de la classe. Ils sont plutôt utiles dans la classe elle-même pour l’exécution de son ou ses processus.

Voici, par exemple, une liste de passagés qui ne sera pas accessible à l’extérieur de l’objet. Portez attention au mot-clé private qui détermine ce que l’on nomme le scope donc de où est-ce que cet élément peut être accédé.

Visual Basic

Public Class Car
    'Membres
    Private _Passengers As List(Of String)

    'Parametres (Propriétés)
    Public Property PaintColor As String
    Public ReadOnly Property IsStarted As Boolean

    'Constructeur
    Public Sub New()

    End Sub
End Class

C#

namespace ClassesCSharp
{
    public class Car
    {
        //Membres
        private List _Passengers;

        //Paramètres
        public string PaintColor { get; set; }
        public bool IsStarted { get; private set; }

        //Constructeur
        public Car()
        {

        }
    }
}

Methodes

Les méthodes sont utiles pour accomplir des actions sur l’objet en question. En effet, les méthodes sont nommées en tant qu’actions. On pensera donc à des noms tels que : AjouterKilomètre, Démarrer (Start), Arrêter (Stop), et autre. De plus, elles peuvent être des Sub (Visual Basic) ou encore des functions (Visual Basic et C#).

Visual Basic

    Public Sub StartEngine()
        'Check if engine is started first!
        If Not IsStarted Then
            IsStarted = True
        End If
    End Sub

C#

    public void StartEngine()
    {
        if (!IsStarted)
            IsStarted = true;
    }

Cet exemple présente une Sub standard (Visual Basic)/function en C# de la class car, c’est donc exactement comme une fonction, vous pouvez aussi y avoir accès en effectuant les mêmes étapes qu’avec les paramètres depuis votre Program.vb/Program.cs. N’oubliez pas que public ou private déterminera si la méthode est accessible de l’extérieur.

Ajoutons maintenant la méthode StopEngine (ArrêterMoteur) à notre classe Car.

Visual Basic

Public Class Car
    'Membres
    Private _IsStarted = False
    Private _Passengers As List(Of String)

    'Paramètres (Propriétés)
    Public Property PaintColor As String
    Public Property IsStarted As Boolean
        Get
            Return _IsStarted
        End Get
        Private Set(value As Boolean)
            _IsStarted = value
        End Set
    End Property

    'Constructeur
    Public Sub New()
        '_Passengers sera Nothing à ce point, nous pouvons donc l'initialiser dans le constructeur avant toute autre opérations
        _Passengers = New List(Of String)
    End Sub

    Public Sub StartEngine()
        'Vérification de l'état du moteur en premier lieu
        If Not IsStarted Then
            IsStarted = True
        End If
    End Sub

    Public Sub StopEngine()
        'Vérification de l'état du moteur en premier lieu
        If IsStarted Then
            IsStarted = False
        End If
    End Sub
End Class

C#

using System.Collections.Generic;

namespace ClassesCSharp
{
    public class Car
    {
        //Membres
        private List _Passengers;

        //Paramètres
        public string PaintColor { get; set; }
        public bool IsStarted { get; private set; }

        //Constructeur
        public Car()
        {
            //_Passengers sera null à ce point, nous pouvons donc l'initialiser dans le constructeur avant toute autre opérations
            _Passengers = new List();
        }

        public void StartEngine()
        {
            //Vérification de l'état du moteur en premier lieu
            if (!IsStarted)
                IsStarted = true;
        }

        public void StopEngine()
        {
            //Vérification de l'état du moteur en premier lieu
            if (IsStarted)
                IsStarted = false;
        }
    }
}

Avez-vous remarqué le constructeur dans le code ci-dessus, j’y ais ajouté l’initialisation de la liste de passagés et oui, comme je disais plus haut, le constructeur est la première chose qui sera exécutée et il fonctionne exactement comme une méthode, toutefois il a la particularité de posséder le même nom que la classe (C#) ou encore le mot-clé New (Visual Basic). Nous verrons les constructeurs plus en détails dans le prochain tutoriel.

Méthodes prédéfinies (héritées)

Certaines méthodes sont prédéfinies lorsque vous créer une nouvelle classe. Elles viennent de l’objet lui-même qui agît comme une sorte de classe maître ou un template si vous préférez. Nous verrons cela aussi dans un prochain tutoriel toutefois retenez que ces méthodes peuvent être implémentées directement dans votre classe.

Instances

Une classe est comme un plan ou un blueprint, c’est une façon de construire des objets. En effet, vous pouvez créer plusieurs instances d’objets réels à partir d’une même classe. Chacune des instances que vous construirez sera unique à sa façon, voyez l’exemple ci-dessous.

Visual Basic

Visual Basic Car instances

C#

C# Instances

Comme vous pouvez le constater, les deux instances sont séparées même si elles proviennent de la classe Car toutes les deux. Dans la première instance la valeur de IsStarted est à false et dans la deuxième elle est à true car nous avons appelé la méthode Start().

Complete Code

Voici le code complet de ce tutoriel.

Program.vb/Program.cs

Visual Basic

Module Program
    Sub Main()
        'Création de deux instances de la classe Car
        Dim MyCar As New Car()
        Dim SecondCar As New Car()

        'Démarrage du moteur de la seconde voiture pour démontrer que les instances sont effectivement séparées
        SecondCar.StartEngine()
        Console.WriteLine("First car status: " & MyCar.IsStarted)
        Console.WriteLine("Second car status: " & SecondCar.IsStarted)

        Console.ReadKey()
    End Sub
End Module

C#

using System;

namespace ClassesCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Création de deux instances de la classe Car
            Car MyCar = new Car();
            Car SecondCar = new Car();

            //Démarrage du moteur de la seconde voiture pour démontrer que les instances sont effectivement séparées
            SecondCar.StartEngine();
            Console.WriteLine("First car status: " + MyCar.IsStarted);
            Console.WriteLine("Second car status: " + SecondCar.IsStarted);

            Console.ReadKey();
        }
    }
}

Car.vb/Car.cs

Visual Basic

Public Class Car
    'Membres
    Private _IsStarted = False
    Private _Passengers As List(Of String)

    'Paramètres (Propriétés)
    Public Property PaintColor As String
    Public Property IsStarted As Boolean
        Get
            Return _IsStarted
        End Get
        Private Set(value As Boolean)
            _IsStarted = value
        End Set
    End Property

    'Constructeur
    Public Sub New()
        '_Passengers sera Nothing donc il est possible de l'initialiser dans le constructeur étant donné que le constructeur sera le premier code exécuté de cette classe
        _Passengers = New List(Of String)
    End Sub

    Public Sub StartEngine()
        'Vérification de l'état du moteur en premier lieu
        If Not IsStarted Then
            IsStarted = True
        End If
    End Sub

    Public Sub StopEngine()
        'Vérification de l'état du moteur en premier lieu
        If IsStarted Then
            IsStarted = False
        End If
    End Sub

    Public Overrides Function ToString() As String
        Return MyBase.ToString()
    End Function
End Class

C#

using System.Collections.Generic;

namespace ClassesCSharp
{
    public class Car
    {
        //Membres
        private List _Passengers;

        //Parametres (Propriétés)
        public string PaintColor { get; set; }
        public bool IsStarted { get; private set; }

        //Constructeur
        public Car()
        {
            //_Passengers sera null à ce point, nous pouvons donc l'initialiser dans le constructeur avant toute autre opérations
            _Passengers = new List();
        }

        public void StartEngine()
        {
            //Vérification de l'état du moteur en premier lieu
            if (!IsStarted)
                IsStarted = true;
        }

        public void StopEngine()
        {
            //Vérification de l'état du moteur en premier lieu
            if (IsStarted)
                IsStarted = false;
        }
    }
}

Conclusion

En conclusion, les classes sont au coeur de la programmation orientée objet donc si vous n’êtes pas certains d’avoir bien compris un des concepts de ce tutoriel, je vous suggère fortement de regarder le vidéo Youtube. De plus, ceci constitue seulement la première partie d’un sujet très vaste alors dans le prochain tutoriel nous irons plus en détails sur plusieurs des concepts. Ne lâchez pas!

Ressources externes

Voici un lien vers la librarie MSDN pour plus de détails sur les classes.

YouTube

Visual Basic

C#

Next article Comment utiliser les constructeurs en C#/Visual Basic
Previous article Les Collections.Generic en Visual Basic/C# - Exercice et solution

Related posts

0 Comments

No Comments Yet!

You can be first to comment this post!

Leave a Comment

Your data will be safe! Your e-mail address will not be published. Also other data will not be shared with third person. Required fields marked as *