Programación D - Interfaces

Una interfaz es una forma de obligar a las clases que heredan de ella a implementar determinadas funciones o variables. Las funciones no deben implementarse en una interfaz porque siempre se implementan en las clases que heredan de la interfaz.

Se crea una interfaz utilizando la palabra clave de interfaz en lugar de la palabra clave de clase, aunque las dos son similares en muchos aspectos. Cuando desea heredar de una interfaz y la clase ya hereda de otra clase, debe separar el nombre de la clase y el nombre de la interfaz con una coma.

Veamos un ejemplo sencillo que explica el uso de una interfaz.

Ejemplo

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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Total area: 35

Interfaz con funciones finales y estáticas en D

Una interfaz puede tener un método final y estático para el que se deben incluir definiciones en la propia interfaz. Estas funciones no pueden ser anuladas por la clase derivada. A continuación se muestra un ejemplo sencillo.

Ejemplo

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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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