2016-08-03 3 views
3

Насколько я понял в Дарте, можно использовать абстрактные классы для объявления «интерфейсов» или «протоколов» (если вы исходите из объектива-с). В любом случае у меня возникли проблемы с поиском способа объявления необязательного метода в абстрактном классе/интерфейсе.Объявление метода как необязательного в абстрактном классе

Если я объявляю метод в абстрактном классе , и пусть конкретный класс B реализовать , я получаю предупреждение в компиляторе. Я хотел бы объявить метод как необязательный или, по крайней мере, предоставить реализацию по умолчанию, не требуя «повторно объявить» его в классе, который реализует мой интерфейс.

abstract class A{ 
    void abstractMethod(); 
} 

class B implements A{ 
//not implementing abstract method here gives a warning 
} 

ответ

2

Это не так, как работают интерфейсы. Если ваш класс заявляет о реализации интерфейса, то это то, что он должен делать.

Вы можете разделить Интерфейс

abstract class A { 
    void abstractMethod(); 
} 

abstract class A1 extends A { 
    void abstractMethod(); 
    void optionalMethod(); 
} 


class B implements A { 
//not implementing abstract method here gives a warning 
} 

только тогда, когда он утверждает, для реализации A1 она должна реализовать optionalMethod.

В качестве альтернативы вы можете расширить абстрактный класс

abstract class A{ 
    void abstractMethod(); 
    void optionalMethod(){}; 
} 

class B extends A { 
//not implementing abstract method here gives a warning 
} 

то только abstractMethod потребности быть переопределены, поскольку A не обеспечивает реализацию.

+0

Я понимаю ваше решение, и с этим согласны "концептуально". Однако мой вопрос был сделан именно для того, чтобы понять, есть ли способ достичь такого поведения в Дарте. В объекте-c я могу объявить метод в «интерфейсе» (даже если это называется протоколом), обозначающем его как @optional. Таким образом, анализатор не будет жаловаться на недостающую реализацию. Надеюсь на такое поведение в дротике, но, судя по вашему ответу, невозможно. –

+0

Я уверен, что нет –

1

Абстрактные методы, определенные в классах, не могут быть помечены как необязательные. (По крайней мере, на обычном языке Dart я не знаю аннотаций, которые могут поддерживать что-то вроде этого.)

Любой класс, который реализует интерфейс, должен обеспечивать реализацию всех абстрактных методов, но эти реализации методов могут тривиально выведите ошибку, чтобы указать, что метод недоступен.

  • Проекционное UnimplementedError если класс реализации является неполным и надлежащее выполнение должно быть добавлено позже

  • Throw UnsupportedError если класс реализации не намерен реализовать метод.

Обратите внимание, что UnimplementedError реализует UnsupportedError.

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

Пример кода:

abstract class A { 
    void abstractMethod(); 
} 

class B implements A { 

    void abstractMethod() { throw new UnimplementedError(...); } 

    // or 

    void abstractMethod() { throw new UnsupportedError(...); } 
} 

См:

https://api.dartlang.org/stable/1.18.1/dart-core/UnimplementedError-class.html https://api.dartlang.org/stable/1.18.1/dart-core/UnsupportedError-class.html

 Смежные вопросы

  • Нет связанных вопросов^_^