Абстрактные классы


Предыдущая страница

Абстракция относится к способности создавать абстрактные классы в ООП. Абстрактным классом является тот, который не может быть создан. Все остальные функциональные возможности класса всё еще существуют, и все его поля, методы и конструкторы доступны одинаковым образом. Просто вы не можете создать экземпляр абстрактного класса.

Если класс абстрактный и не может быть создан, класс не имеет большого смысла, если у него нет подклассов. Как правило, абстрактные классы возникают на этапе проектирования. Родительский класс содержит общую функциональность набора дочерних классов, но сам он является слишком абстрактным, чтобы его можно было использовать самостоятельно.

Использование абстрактных классов в D

Используйте ключевое слово abstract для объявления абстрактного класса. Это ключевое слово должно находиться в объявлении класса перед ключевым словом class. Ниже приведен пример того, как абстрактный класс можно унаследовать и использовать.

Пример

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 = "Сотрудник1"; 
   
   writeln(emp.name); 
   writeln(emp.getAge); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Сотрудник1
37

Абстрактные функции

Подобно классам, функции также могут быть абстрактными. Реализация такой функции не предоставляется в своём классе, но должна предоставляться в классе, который наследует класс с абстрактной функцией. В вышеприведённый пример добавлена абстрактная функция.

Пример

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("Сведения о сотруднике указаны ниже:"); 
      writeln("ID сотрудника: ", this.empID); 
      writeln("Имя сотрудника: ", this.name); 
      writeln("Возраст: ",this.getAge); 
   } 
} 

void main() { 
   Employee emp = new Employee(); 
   emp.empID = 101; 
   emp.birthYear = 1980; 
   emp.birthDay = 10; 
   emp.birthMonth = 10; 
   emp.name = "Сотрудник1"; 
   emp.print(); 
}

Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:

Сведения о сотруднике указаны ниже:
ID сотрудника: 101
Имя сотрудника: Сотрудник1
Возраст: 37

Предыдущая страница