flutter 如何在Dart 3中声明接口方法?

gg58donl  于 2023-05-19  发布在  Flutter
关注(0)|答案(3)|浏览(250)

我最近从Dart 2迁移到Dart 3,并注意到添加了类修饰符,包括接口类。它们在设置属性时工作得非常好,但是当涉及到方法时,它会抛出一个错误,指出我需要将类转换为抽象类。基于逻辑,我理解接口不应该有方法体。下面是一个例子:
工作正常:

interface class Foo {
  late String bar;
}

抛出dartconcrete_class_with_abstract_member:

interface class Foo {
  late String bar;
  
  // 'getFormattedBar' must have a method body because 'Foo' isn't abstract.
  // Try making 'Foo' abstract, or adding a body to 'getFormattedBar'.
  // (dartconcrete_class_with_abstract_member)
  String getFormattedBar(); 
}

如何在Dart 3中声明接口方法?
我希望在接口中定义方法(当然是按照接口的定义),然后在实现类中用它们各自的主体建立它们的具体实现。相反,我被迫在接口中放置一个空的主体,这没有任何意义。最好有这样的东西:

interface class Foo {
  late String bar;
  String getFormattedBar(); 
}
uqzxnwby

uqzxnwby1#

interface关键字确保您只能implement类,而不是mixinextend类。或者换句话说,它确保您不能从类继承。
如果interface类修饰符是唯一使用的类修饰符,则仍然可以构造类。这意味着这些方法需要有一个具体的实现。

// Can be constructed and implemented, but not extended nor mixed in.
interface class Foo {

  // Implementation needed
  String bar() {
    return 'baz';
  }
}

如果您还添加了abstract类修饰符,则无法构造类,并且方法不必具有具体的实现。

// Can not be constructed.
// Can be implemented, but not extended nor mixed in.
abstract interface class Foo {

  // Implementation should be left out
  String bar();
}
rkkpypqq

rkkpypqq2#

要在接口中包含方法,必须使用abstract interface class,而不仅仅是interface class。这将允许您在接口中包含没有主体的方法(这有点多余)。
示例:

abstract interface class Foo {
  late String bar;
  
  String getFormattedBar();   // Works fine :)
}
pbwdgjma

pbwdgjma3#

在DartDart 2中,你像这样声明你的接口;

abstract class Foo {
  late String bar;

  String getFormattedBar(); 
}

然后像这样实施;

class IFoo implements Foo {
  //implement the methods
}

在 dart 3中:

abstract interface class Foo {
  late String bar;

  String getFormattedBar(); 
}

相关问题