Общий код в абстрактном классе в Dart
Абстрактный класс не обязан состоять только из абстрактных методов. В одном типе удобно держать и общий код с реализацией, и объявления без тела, которые потомки должны дописать сами.
Общие поля и методы родителя наследуются как у обычного класса. Абстрактные члены задают, что именно каждый потомок обязан реализовать:
abstract class Post {
String title = "";
int likes = 0;
String getTitle() => title;
void setTitle(String title) {
this.title = title;
}
void showTitle() {
print(title);
}
abstract void increaseRevenue(int value);
}
Метод showTitle уже имеет тело - его не переопределяют
в Employee и Note, а просто вызывают. Метод
increaseRevenue в каждом потомке свой:
class Employee extends Post {
int salary = 0;
@override
void increaseRevenue(int value) {
salary += value;
}
int getSalary() => salary;
}
class Note extends Post {
@override
void increaseRevenue(int value) {
likes += value;
}
}
Конкретный метод с телом в абстрактном классе можно вызывать у любого потомка. Например, общий вывод заголовка записи:
abstract class Post {
String title = "";
void show() {
print(title);
}
}
class Note extends Post {}
В абстрактном классе допустимы приватные вспомогательные методы - их видят только методы того же файла. Публичная логика родителя может пользоваться ими при проверке данных:
abstract class Post {
String _title = "";
bool _isNotEmpty(String text) {
return text.isNotEmpty;
}
void setTitle(String title) {
if (_isNotEmpty(title)) {
_title = title;
}
}
String getTitle() => _title;
String roleLabel();
}
class Employee extends Post {
@override
String roleLabel() => "employee";
}
Сделайте абстрактный класс Figure
с методом describe, который выводит
на экран площадь и периметр фигуры.
Сделайте геттеры area и
perimeter абстрактными.
Реализуйте класс Circle.