2015-06-15 6 views
1

Я реализую иерархию наследования, в которой построение производного класса состоит только из вызова конструктора базового класса. Конструктор базового класса затем вызывает метод (ы), реализованный только в производном классе.Абстрактные методы в 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().

+1

Трудно сказать, не видя никакого конкретного кода, который показывает, что вы пытаетесь достичь или какое-либо сообщение об ошибке бетона. –

+0

Это нормальное объектно-ориентированное поведение. Если вы переопределите метод в производном классе, этот метод вызывается вместо него (называемый динамическим связыванием). Вы можете явно вызвать метод базового класса из производного класса, например 'super.x();' например, для повторного использования базовой реализации. –

+0

Спасибо. Даже часть о вызове x() в A(), привязанная к B :: x()? –

ответ

1

Из Вашего вопроса я хотел бы ожидать подобный код

void main() { 
new B(); 
} 

abstract class A { 
    A() { 
    a(); 
    b(); 
    c(); 
    } 
    a(); 
    b(); 
    c(); 
} 

class B extends A { 
    B() : super(); 

    @override 
    a() => print('a'); 
    @override 
    b() => print('b'); 
    @override 
    c() => print('c'); 
} 

Try в DartPad

Из вашего комментария о получении ошибки, я ожидаю, что вы не абстрактные заглушек метод в базовом классе. Может быть, это то, что вы ищете

void main() { 
new B(); 
} 

@proxy 
abstract class A { 
    A() { 
    a(); 
    b(); 
    c(); 
    } 
} 

class B extends A { 
    B() : super(); 

    a() => print('a'); 
    b() => print('b'); 
    c() => print('c'); 
} 
Смежные вопросы