Свои тела методов в Dart
Метод в контракте задает имя, параметры и тип результата.
Если тела нет, реализацию пишут в классе с implements.
Сигнатура в классе должна совпадать с контрактом, включая
типы параметров:
class MathOps {
int sum(int a, int b);
int subtract(int a, int b);
}
Класс реализует каждый такой метод с тем же списком аргументов. Изменить количество параметров или их типы нельзя - это уже другой метод, и контракт будет нарушен:
class SimpleMath implements MathOps {
int sum(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
}
Слово implements не копирует готовое тело из контракта.
Даже если у другого класса метод уже с телом, в реализации
все равно пишут свою версию команды:
class Printable {
void show();
}
class Post implements Printable {
String title = "";
void show() {
print(title);
}
}
Контракт может описывать не только методы, но и геттеры.
Геттер без тела в контракте класс реализации задает через
поле, параметр конструктора или явный get:
class Named {
String get name;
}
class Person implements Named {
String name;
Person(this.name);
}
Геттер только для чтения объявляют через get,
изменяемое свойство - через get и set
или через публичное поле, если контракт это допускает:
class Labeled {
String get label;
String get caption;
}
class Tag implements Labeled {
String label;
Tag(this.label);
String get caption {
return "label: $label";
}
}
Если в контракте указаны и чтение, и запись, класс должен предоставить оба доступа - обычно через свое поле:
class Counter {
int get value;
set value(int v);
}
class MutableCounter implements Counter {
int value = 0;
}
Сделайте класс Converter, в котором
будут методы toUpper и toLower.
Пусть оба метода принимают параметр типа
String и возвращают String.
Сделайте класс TextConverter, который будет
реализовывать класс Converter.
Сделайте класс Identifiable. Пусть
в контракте будет геттер id типа
int только для чтения.
Сделайте класс Product, который будет
реализовывать класс Identifiable.
Значение id передавайте
параметром конструктора.