devstory

Le Tutoriel de C# Properties

  1. C# Property
  2. La propriété abstraite (Abstract Property)

1. C# Property

Property est un membre (member) d'une classe, de l'interface. Property est une extension d'un champ (field). Property vous permet d'accéder à un champ ou de changer la valeur de ledit champ, alors qu'il n'est pas nécessaire d'accéder directement à un champ.

Vous pouvez créer une Property qui ne permet qu'accéder à un champ, ne permet pas de changer la valeur du champ et vice versa. C'est la caractéristique la plus puissante d'une Property.

Avec le champ (field), vous pouvez y accéder depuis l'extérieur, vous pouvez également changer sa valeur, et cela est tellment dangereux, observez l'exemple:
Employee.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee
    {
        // Pour être accessible de l'extérieur,
        // ce champ (field) doit être 'public' ou 'protected'.
        public string code;

        // Pour être accessible de l'extérieur,
        // ce champ (field) doit être 'public' ou 'protected'.
        public string name;

        public Employee(string code, string name)
        {
            this.code = code;
            this.name = name;
        }
    }


    class EmployeeTest
    {

        public static void Main(string[] args)
        {
            // Créez un objet Employee.
            Employee john = new Employee("E01", "John");

            // Vous pouvez accéder au nom de l'employé.
            // (name est un champ public pour que vous puissiez y accéder à l'extérieur).
            Console.WriteLine("Employee Name = " + john.name);

            // Mais vous pouvez également attribuer une nouvelle valeur au champ de nom.
            // (C'est évidemment dangereux).
            john.name = "Marry";

            Console.WriteLine("Employee Name = " + john.name);

            Console.Read();
        }
    }

}
Property est une solution pour résoudre ledit problème. Ci- dessous est un exemple qui utilise Property Code, Name pour accéder le champ code, name de la classe Employee2.
Employee2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee2
    {
        // Ce champ est privé,
        // Il ne permet pas l'accès externe.
        private string code;

        // Ce champ est privé,
        // Il ne permet pas l'accès externe.
        private string name;

        // Déclarez une propriété (property), qui est publique, accessible de l'extérieur.
        public string Code
        {
            get
            {
                return this.code;
            }
            set
            {
                // 'value' est un mot-clé spécial,
                // Cela implique la nouvelle valeur attribuée à la propriété (property).
                this.code = value;
            }
        }

        // Déclarez une propriété, publique, est possible l'accès,
        // mais n'est pas autorisé à attribuer de nouvelles valeurs.
        public string Name
        {
            get
            {
                return this.name;
            }
        }



        public Employee2(string code, string name)
        {
            this.code = code;
            this.name = name;
        }
    } 

}
Test:
Employee2Test.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee2Test
    {
        public static void Main(string[] args)
        { 

            // Créez un objet Employee.
            Employee2 john = new Employee2("E01", "John");

           
            Console.WriteLine("Employee Code = " + john.Code);
            Console.WriteLine("Employee Name = " + john.Name);
            Console.WriteLine("-------");

            // Attribuez une valeur à la propriété Code.
            john.Code = "E02";

            // Impossible d'attribuer une nouvelle valeur à la propriété Name.
            // ​​​​​​​john.Name = "Marry"; // ==> Error!
            Console.WriteLine("Employee Code = " + john.Code);
            Console.WriteLine("Employee Name = " + john.Name);

            Console.Read();
        }
    }

}
Exécution l'exemple:
Employee Code = E01
Employee Name = John
------
Employee Code = E02
Employee Name = John

2. La propriété abstraite (Abstract Property)

Property est utilisée pour set et get la valeur d'un champ, en substance elle est considérée comme une méthode exceptionnelle, donc elle est également déclarée abstrait et elle va être mise en oeuvre (implements) à une sous- classe. La classe propriété (property) déclare étant comme abstraite; elle doit être déclarée comme abstraite. La propriété abstraite peut être également déclarée dans l' interface.
Animal est une classe qui déclare 2 propriétés abstraites (Name & Age):
Animal.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    abstract class Animal
    { 
        // Une propriété abstraite (abstract Property).
        public abstract string Name
        {
            get; 
        } 
        // ​​​​​​​
        // Une propriété abstraite a set & get.
        public abstract int Age
        {
            get;
            set;
        }
    } 
}
La classe Cat est étendue de Animal, et met en oeuvre des propriétés abstraites dans Animal.
Cat.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{ 
    class Cat : Animal
    {
        private string name;
        private int age;

        // Implémentez la propriété abstraite déclarée dans la classe Animal.
        public override string Name
        {
            get
            {
                return this.name;
            }
        } 
        // Implémentez la propriété abstraite déclarée dans la classe Animal.
        public override int Age
        {
            get
            {
                return this.age;
            }
            set
            {
                this.age = value;
            }
        } 
        // Constructor.
        public Cat(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
    } 
}
Property dans Interface
Vous pouvez déclarer également Property dans une Interface, ces propriétés vont mettre en oeuvre (implements) aux sous- classes.
IColor.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    interface IColor
    { 
        // Une propriété abstraite de l'interface
        String Color
        {
            get;
        }
    } 
}
La classe Ball met en oeuvre Interface de IColor, elle met en oeuvre (implements) des propriétés abstraites déclarées dans IColor.
Ball.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Ball : IColor
    {
        private string color; 
        // Implémente la propriété déclarée dans Interacle IColor
        // (N'écrivez pas le mot clé 'override' ici,
        // car il implémente une propriété d'interface).
        public string Color
        {
            get
            {
                return this.color;
            }
        } 
        // Constructor.
        public Ball(String color)
        {
            this.color = color;
        }
    } 
}