Programowanie D - zajęcia abstrakcyjne

Abstrakcja odnosi się do umiejętności tworzenia abstrakcyjnych klas w OOP. Klasa abstrakcyjna to taka, której nie można utworzyć instancji. Wszystkie inne funkcje klasy nadal istnieją, a jej pola, metody i konstruktory są dostępne w ten sam sposób. Po prostu nie możesz utworzyć instancji klasy abstrakcyjnej.

Jeśli klasa jest abstrakcyjna i nie można jej utworzyć instancji, nie ma ona większego zastosowania, chyba że jest podklasą. Tak zwykle powstają klasy abstrakcyjne na etapie projektowania. Klasa nadrzędna zawiera typową funkcjonalność kolekcji klas potomnych, ale sama klasa nadrzędna jest zbyt abstrakcyjna, aby mogła być używana samodzielnie.

Korzystanie z klasy abstrakcyjnej w D

Użyj abstractsłowo kluczowe, aby zadeklarować abstrakcję klasy. Słowo kluczowe pojawia się w deklaracji klasy gdzieś przed słowem kluczowym class. Poniżej przedstawiono przykład sposobu dziedziczenia i używania klasy abstrakcyjnej.

Przykład

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

Kiedy kompilujemy i uruchamiamy powyższy program, otrzymamy następujące dane wyjściowe.

Emp1
37

Funkcje abstrakcyjne

Podobnie jak funkcje, klasy mogą być również abstrakcyjne. Implementacja takiej funkcji nie jest podana w jej klasie, ale powinna być zapewniona w klasie, która dziedziczy klasę z funkcją abstrakcyjną. Powyższy przykład został zaktualizowany o funkcję abstrakcyjną.

Przykład

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

Kiedy kompilujemy i uruchamiamy powyższy program, otrzymamy następujące dane wyjściowe.

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