在抽象类中将方法声明为可选方法

时间:2016-08-03 18:01:15

标签: oop interface dart abstract-class

就我在Dart中所理解的而言,可以使用抽象类来声明&#​​34;接口"或"协议" (如果你来自Objective-c)。 无论如何,我在寻找在抽象类/接口中声明可选方法的方法时遇到了麻烦。

如果我在抽象类 A 中声明一个方法,并让具体类 B 实现 A ,我会在编译器。 我希望能够将方法声明为可选方法,或者至少提供默认实现,而无需重新声明"它在一个实现我的界面的类中。

abstract class A{
   void abstractMethod();
}

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

2 个答案:

答案 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