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