Я реализую иерархию наследования, в которой построение производного класса состоит только из вызова конструктора базового класса. Конструктор базового класса затем вызывает метод (ы), реализованный только в производном классе.Абстрактные методы в Dart
У меня есть базовая реализация, но DartEditor, конечно, жалуется на недостающие методы в базовом классе. Как я могу сделать это счастливым?
Изменить: Я еще не бежал какой-либо код, прежде чем отправлять на мой вопрос, и получается, что метод связывания работ в порядке, можно было бы ожидать:
void main() {
new B();
}
abstract class A {
A() {
x();
y();
}
x() => print('A.x');
y() => print('A.y');
}
class B extends A {
B() : super();
@override
x() => print('B.x');
}
Приведенный выше код выводит следующее, что желаемое поведение. B
конструктор вызывает конструктор A
, который вызывает x()
. Но так как есть x()
определено для B
, это одна называется:
B.x
A.y
Это интересно отметить, что, хотя x()
вызывается с помощью A
«s конструктора, Dart каким-то образом знает называть B
» s x()
. Я полагаю, это потому, что цепочка вызовов выглядит примерно так:
B() -> A() -> B::x()
Во время выполнения Dart проверяет цепочку вызовов, чтобы определить, к какому объекту связывать x()
.
Трудно сказать, не видя никакого конкретного кода, который показывает, что вы пытаетесь достичь или какое-либо сообщение об ошибке бетона. –
Это нормальное объектно-ориентированное поведение. Если вы переопределите метод в производном классе, этот метод вызывается вместо него (называемый динамическим связыванием). Вы можете явно вызвать метод базового класса из производного класса, например 'super.x();' например, для повторного использования базовой реализации. –
Спасибо. Даже часть о вызове x() в A(), привязанная к B :: x()? –