Проверка типа в Dart
Оператор is проверяет тип значения во время
выполнения. Для контракта выражение shape is Figure
даст true, если объект создан классом,
реализующим Figure:
class Figure {
double area();
}
class Disk implements Figure {
double _radius;
Disk(this._radius);
double area() {
return 3.14 * _radius * _radius;
}
}
Создадим объект и выведем его:
Figure shape = Disk(2.0);
print(shape is Disk);
print(shape is Figure);
Отрицание записывают как is!. После успешной
проверки is в той же ветке кода тип переменной
сужается, и методы контракта можно вызывать
без приведения:
void describe(Object value) {
if (value is Figure) {
print(value.area());
}
}
Проверка контракта удобна, когда в одной коллекции лежат объекты разных классов, а обрабатывать нужно только те, что подходят под общий набор команд:
class VolumeFigure {
double volume();
}
void printAreas(List<Object> items) {
for (var item in items) {
if (item is Figure) {
print(item.area());
} else if (item is VolumeFigure) {
print(item.volume());
}
}
}
Сделайте класс VolumeFigure, который будет
иметь метод volume и метод surfaceArea.
Сделайте класс Cube, который будет
реализовывать класс VolumeFigure.
Создайте несколько объектов классов, реализующих
класс Figure, и несколько объектов
класса Cube. Запишите их в список
в случайном порядке.
Переберите циклом этот список и выведите
на экран только площади объектов, реализующих
класс Figure.
Переберите циклом тот же список и выведите для плоских фигур их площади, а для объемных - площади их поверхности.