Programación D - Herencia

Uno de los conceptos más importantes de la programación orientada a objetos es la herencia. La herencia permite definir una clase en términos de otra clase, lo que facilita la creación y el mantenimiento de una aplicación. Esto también brinda la oportunidad de reutilizar la funcionalidad del código y el tiempo de implementación rápido.

Al crear una clase, en lugar de escribir miembros de datos y funciones de miembros completamente nuevos, el programador puede designar que la nueva clase debe heredar los miembros de una clase existente. Esta clase existente se llamabase clase, y la nueva clase se conoce como el derived clase.

La idea de herencia implementa la es una relación. Por ejemplo, mamífero IS-A animal, perro IS-A mamífero, por lo tanto perro IS-A animal también y así sucesivamente.

Clases base y clases derivadas en D

Una clase puede derivarse de más de una clase, lo que significa que puede heredar datos y funciones de varias clases base. Para definir una clase derivada, usamos una lista de derivación de clases para especificar la (s) clase (s) base. Una lista de derivación de clases nombra una o más clases base y tiene la forma -

class derived-class: base-class

Considere una clase base Shape y su clase derivada Rectangle como sigue -

import std.stdio;

// Base class 
class Shape { 
   public: 
      void setWidth(int w) { 
         width = w; 
      }

      void setHeight(int h) { 
         height = h; 
      }
   
   protected: 
      int width; 
      int height; 
}
  
// Derived class 
class Rectangle: Shape { 
   public: 
      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

Control de acceso y herencia

Una clase derivada puede acceder a todos los miembros no privados de su clase base. Por tanto, los miembros de la clase base que no deberían ser accesibles para las funciones miembro de las clases derivadas deberían declararse privados en la clase base.

Una clase derivada hereda todos los métodos de la clase base con las siguientes excepciones:

  • Constructores, destructores y constructores de copia de la clase base.
  • Operadores sobrecargados de la clase base.

Herencia multinivel

La herencia puede ser de varios niveles y se muestra en el siguiente ejemplo.

import std.stdio;

// Base class 
class Shape {
   public:
      void setWidth(int w) {
         width = w; 
      }

      void setHeight(int h) {
         height = h; 
      }

   protected: 
      int width; 
      int height; 
}

// Derived class 
class Rectangle: Shape {
   public:
      int getArea() {
         return (width * height); 
      }
}
 
class Square: Rectangle {
   this(int side) {
      this.setWidth(side); 
      this.setHeight(side); 
   }
}

void main() {
   Square square = new Square(13);

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

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

Total area: 169