【问题标题】:declaring a method as optional in abstract class在抽象类中将方法声明为可选
【发布时间】:2016-12-09 14:15:22
【问题描述】:

据我所知,在 Dart 中可以使用抽象类来声明“接口”或“协议”(如果您来自 Objective-c)。 无论如何,我很难找到在抽象类/接口中声明可选方法的方法。

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

abstract class A{
   void abstractMethod();
}

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

【问题讨论】:

    标签: oop interface dart abstract-class


    【解决方案1】:

    接口不是这样工作的。如果你的类声明要实现一个接口,那么这就是它必须做的。

    可以拆分界面

    abstract class A {
       void abstractMethod();
    }
    
    abstract class A1 extends A {
       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 不提供实现。

    【讨论】:

    • 我理解您的解决方案,并在“概念上”同意它。然而,我的问题正是为了了解是否有办法在 Dart 中实现这种行为。在objective-c中,我可以在“接口”(即使被称为协议)中声明一个方法,将其标记为@optional。这样分析器就不会抱怨缺少实现。希望在飞镖中出现这种行为,但显然,从你的回答来看,这是不可能的。
    • 我很确定没有
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-10
      • 2015-02-28
      • 2021-06-10
      • 2017-05-13
      • 2011-01-23
      • 1970-01-01
      • 2012-10-31
      • 2015-06-29
      相关资源
      最近更新 更多