Mémo Programmation C# : interface

Une interface, en programmation, est une sorte de contrat passé avec une classe.

L’interface définit les méthodes que des classes ayant un contrat avec celle-ci doivent implémenter (et ce, pour chacune des méthodes définies). Dans l’interface, on trouvera uniquement la signature des méthodes, aucun code, pas de propriété, et comme ces méthodes sont obligatoirement publiques par définition, on ne renseignera pas non plus d’attribut de visibilité.

Note : La notation d’une interface commence généralement par un I.

Rappel : Contrairement à l’héritage qui ne peut avoir qu’une seule classe de base, une classe peut implémenter plusieurs interfaces.

Exemple:

interface-1

public interface IEntity{
     String GetIdentification();
}

public class Robot : IEntity{
     int serialNumber;

     public Robot(int serial){
          this.serialNumber = serial;
     }

     public string GetIdentification(){
          return this.serialNumber.ToString();
     }
}

public class Human : IEntity{
     String name;
     String firstName;
     public Human(String name, String firstname){
          this.name = name;
          this.firstName = firstname;
     }

     public string GetIdentification(){
          return string.Format("{0} {1}", this.firstName, this.name);
     }
}

Une interface peut être dérivée d’une autre interface. L’interface dérivée comprend alors ses propres méthodes ainsi que celles de son interface de base (signatures uniquement).

Exemple:

public interface IEntity{
     String GetIdentification();
}

public interface IMammal{ //interface mamifère
     int GetWeigth();
}

public class Robot : IEntity{
     int serialNumber;

     public Robot(int serial){
          this.serialNumber = serial;
     }

     public string GetIdentification(){
          return this.serialNumber.ToString();
     }
}

public class Human : IEntity, IMammal{
     String name;
     String firstName;
     int weigth = 0;

     public Human(String name, String firstname, int weigth){
          this.name = name;
          this.firstName = firstname;
          this.weigth = weigth;
     }

     public string GetIdentification(){
          return string.Format("{0} {1}", this.firstName, this.name);
     }

     public string GetWeigth(){
          return this.weigth;
     }
}

Si par exemple, plusieurs interfaces ont la même signature de méthode, pour résoudre cette l’ambiguïté, il suffit de préciser qu’elle est l’interface de la méthode :

public interface IEntity{
     String GetIdentification();
}

public interface IMammal{ //interface mamifère
     String GetIdentification();
     int GetWeigth();
}

public class Human : IEntity, IMammal{
     String name;
     String firstName;
     int weigth = 0;
     String type = "Humain";
     String sex;

     public Human(String name, String firstname, int weigth, String sex){
          this.name = name;
          this.firstName = firstname;
          this.weigth = weigth;
          this.sex = sex;
     }

     public string IEntity.GetIdentification(){
          return string.Format("{0} {1}", this.firstName, this.name);
     }

     public string IMammal.GetIdentification(){ 
          return string.Format("{0} - {1}", this.type, this.sex); 
     }

     public string GetWeigth(){
          return this.weigth;
     }
}

Pour exécuter les fonctions appliquées à un object de type Human, on les appelera de la façon suivante :

Human h = new Human("Henriette", "Hamon", 58, "femme");

//do IEntity.GetIdentification
IEntity ie = h; //pass reference
ie.GetIdentification(); //return -> "Henriette Hamon" 
//exécution de GetIdentification de l'interface IEntity appliquée a l'objet h

//do IMammal.GetIdentification
IMammal im = h; //pass reference
im.GetIdentification(); //return -> "Humain - femme"

On peut déterminer quelle classe implémente quelle interface :

public class Human { //classe humain
     String name;
     String firstName;

     public Human(String name, String firstname){
          this.name = name;
          this.firstName = firstname;
     }

     public string GetFullName(){
          return string.Format("{0} {1}", this.firstName, this.name);
     }
}

public interface IMammal{ //interface mamifère 
     int GetWeigth(); 
}

public class Student : Human, IMammal{ 
//classe étudiant implémentant la classe humain et l'interface mamifère
     int weigth = 0;

     public Student(String name, String firstname, int weigth): base(name, firstname)
     {
          //base(name, firstname) spécifie quel constructeur de classe de base appeler lors 
          //de la création d'instance de la classe dérivée
          this.weigth = weigth;
     }

     public int GetWeigth()
     {
          return this.weigth;
     }
}

//Dans le programme
class Program
    {
        static void Main(string[] args)
        {
            Human student = new Student("Hamon", "Henriette", 58);
            //L'objet déclaré student est en réalité un objet de type Student

            if (student is IMammal) //student implément effectivement IMammal
            {
                IMammal imammal = (IMammal)student;
                //student est en réalité du type Student mais le cast est nécéssaire car 
                //ici, la classe Human n'implémente pas IMammal

                Console.WriteLine(string.Format(" Etudiant : {0} de {1}kg.",
                                                student.GetFullName(),
                                                imammal.GetWeigth().ToString()));
            }
            Console.ReadLine(); //mettre la console en attente
        }
    }

interface-2

Et voilà pour mon mémo sur les interfaces 🙂