Programmation D - Interfaces

Une interface est un moyen de forcer les classes qui en héritent à devoir implémenter certaines fonctions ou variables. Les fonctions ne doivent pas être implémentées dans une interface car elles sont toujours implémentées dans les classes qui héritent de l'interface.

Une interface est créée en utilisant le mot-clé interface au lieu du mot-clé class, même si les deux sont similaires à bien des égards. Lorsque vous souhaitez hériter d'une interface et que la classe hérite déjà d'une autre classe, vous devez séparer le nom de la classe et le nom de l'interface par une virgule.

Prenons un exemple simple qui explique l'utilisation d'une interface.

Exemple

import std.stdio;

// Base class
interface Shape {
   public: 
      void setWidth(int w);
      void setHeight(int h);
}

// Derived class
class Rectangle: Shape {
   int width;
   int height;
   
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h; 
      }
      int getArea() {
         return (width * height);
      }
}

void main() {
   Rectangle Rect = new Rectangle();
   Rect.setWidth(5);
   Rect.setHeight(7);

   // Print the area of the object.
   writeln("Total area: ", Rect.getArea());
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Total area: 35

Interface avec les fonctions finales et statiques en D

Une interface peut avoir une méthode finale et statique pour laquelle les définitions doivent être incluses dans l'interface elle-même. Ces fonctions ne peuvent pas être remplacées par la classe dérivée. Un exemple simple est présenté ci-dessous.

Exemple

import std.stdio;

// Base class
interface Shape {
   public:
      void setWidth(int w);
      void setHeight(int h);
      
      static void myfunction1() {
         writeln("This is a static method");
      }
      final void myfunction2() {
         writeln("This is a final method");
      }
}

// Derived class
class Rectangle: Shape {
   int width;
   int height; 
   
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      int getArea() {
         return (width * height);
      }
}

void main() {
   Rectangle rect = new Rectangle();

   rect.setWidth(5);
   rect.setHeight(7);
   
   // Print the area of the object.
   writeln("Total area: ", rect.getArea());
   rect.myfunction1();
   rect.myfunction2();
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Total area: 35 
This is a static method 
This is a final method