Programmazione D - Interfacce

Un'interfaccia è un modo per forzare le classi che ereditano da essa a dover implementare determinate funzioni o variabili. Le funzioni non devono essere implementate in un'interfaccia perché sono sempre implementate nelle classi che ereditano dall'interfaccia.

Un'interfaccia viene creata usando la parola chiave interface invece della parola chiave class anche se le due sono simili in molti modi. Quando si desidera ereditare da un'interfaccia e la classe eredita già da un'altra classe, è necessario separare il nome della classe e il nome dell'interfaccia con una virgola.

Vediamo un semplice esempio che spiega l'uso di un'interfaccia.

Esempio

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());
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Total area: 35

Interfaccia con funzioni finali e statiche in D

Un'interfaccia può avere un metodo finale e statico per il quale le definizioni dovrebbero essere incluse nell'interfaccia stessa. Queste funzioni non possono essere sovrascritte dalla classe derivata. Di seguito viene mostrato un semplice esempio.

Esempio

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();
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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