就我在Dart中所理解的而言,可以使用抽象类来声明"接口"或"协议" (如果你来自Objective-c)。 无论如何,我在寻找在抽象类/接口中声明可选方法的方法时遇到了麻烦。
如果我在抽象类 A 中声明一个方法,并让具体类 B 实现 A ,我会在编译器。 我希望能够将方法声明为可选方法,或者至少提供默认实现,而无需重新声明"它在一个实现我的界面的类中。
abstract class A{
void abstractMethod();
}
class B implements A{
//not implementing abstract method here gives a warning
}
答案 0 :(得分: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
没有提供实现。
答案 1 :(得分:2)
类中定义的抽象方法不能标记为可选。 (至少不是常规的Dart语言,我不知道可能支持这样的东西的注释。)
任何实现接口的类都必须提供所有抽象方法的实现,但是,这些方法实现可能会引发错误以指示该方法不可用。
如果实施类不完整并且稍后要添加正确的实现,则抛出UnimplementedError
如果实现类不打算实现该方法,则抛出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