Programación D - Clases abstractas

La abstracción se refiere a la capacidad de hacer un resumen de clase en OOP. Una clase abstracta es aquella que no se puede instanciar. Todas las demás funciones de la clase todavía existen, y se accede a sus campos, métodos y constructores de la misma manera. Simplemente no puede crear una instancia de la clase abstracta.

Si una clase es abstracta y no se puede instanciar, la clase no tiene mucho uso a menos que sea una subclase. Normalmente, así es como surgen las clases abstractas durante la fase de diseño. Una clase principal contiene la funcionalidad común de una colección de clases secundarias, pero la clase principal en sí es demasiado abstracta para ser utilizada por sí sola.

Usando la clase abstracta en D

Utilizar el abstractpalabra clave para declarar un resumen de clase. La palabra clave aparece en la declaración de clase en algún lugar antes de la palabra clave de clase. A continuación se muestra un ejemplo de cómo se puede heredar y usar la clase abstracta.

Ejemplo

import std.stdio;
import std.string;
import std.datetime;

abstract class Person {
   int birthYear, birthDay, birthMonth; 
   string name; 
   
   int getAge() {
      SysTime sysTime = Clock.currTime(); 
      return sysTime.year - birthYear;
   }
}

class Employee : Person {
   int empID;
}

void main() {
   Employee emp = new Employee(); 
   emp.empID = 101; 
   emp.birthYear = 1980; 
   emp.birthDay = 10; 
   emp.birthMonth = 10; 
   emp.name = "Emp1"; 
   
   writeln(emp.name); 
   writeln(emp.getAge); 
}

Cuando compilemos y ejecutemos el programa anterior, obtendremos el siguiente resultado.

Emp1
37

Funciones abstractas

Al igual que las funciones, las clases también pueden ser abstractas. La implementación de dicha función no se da en su clase, pero debe proporcionarse en la clase que hereda la clase con función abstracta. El ejemplo anterior se actualiza con función abstracta.

Ejemplo

import std.stdio; 
import std.string; 
import std.datetime; 
 
abstract class Person { 
   int birthYear, birthDay, birthMonth; 
   string name; 
   
   int getAge() { 
      SysTime sysTime = Clock.currTime(); 
      return sysTime.year - birthYear; 
   } 
   abstract void print(); 
}
class Employee : Person { 
   int empID;  
   
   override void print() { 
      writeln("The employee details are as follows:"); 
      writeln("Emp ID: ", this.empID); 
      writeln("Emp Name: ", this.name); 
      writeln("Age: ",this.getAge); 
   } 
} 

void main() { 
   Employee emp = new Employee(); 
   emp.empID = 101; 
   emp.birthYear = 1980; 
   emp.birthDay = 10; 
   emp.birthMonth = 10; 
   emp.name = "Emp1"; 
   emp.print(); 
}

Cuando compilemos y ejecutemos el programa anterior, obtendremos el siguiente resultado.

The employee details are as follows: 
Emp ID: 101 
Emp Name: Emp1 
Age: 37