首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义具有参数化类型的泛型类,需要在dart中实现多个抽象类。

定义具有参数化类型的泛型类,需要在dart中实现多个抽象类。
EN

Stack Overflow用户
提问于 2020-01-07 06:16:47
回答 1查看 21关注 0票数 0

接口

代码语言:javascript
复制
abstract class Adder<T> {
  T add(T a, T b);
}

abstract class Multiplier<T> {
  T multiply(T a, T b);
}

abstract class Displayer<T> {
  void display(T a);
}

一个恰好实现了这三个方面的实现。

代码语言:javascript
复制
class IntImpl implements Adder<int>, Multiplier<int>, Displayer<int> {
  @override
  int add(int a, int b) {
    return a + b;
  }

  @override
  int multiply(int a, int b) {
    return a * b;
  }

  @override
  void display(int a) {
    print('printing: ${a}');
  }
}

需要支持两个接口的使用者。但是,我找不到怎么申报这样一件事。

代码语言:javascript
复制
class DisplayingAdder<T, K extends Adder<T>> {
  final K engine;

  DisplayingAdder(this.engine);

  T addAndDisplay(T a, T b) {
    final r = engine.add(a, b);
    // How do I change DisplayingAdder class parametrization to make the next line functional?
    // engine.display(r);
    return r;
  }
}

执行上述操作的代码

代码语言:javascript
复制
void main() {
  final e1 = IntImpl();
  final da = DisplayingAdder(e1);
  da.addAndDisplay(3,4);
}

不确定可以更改什么以允许泛型参数声明对多个抽象类的支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-07 06:40:26

不能将泛型类型限制为实现多个超级类型的类型。最好的方法是将engine分离为实现Adder的对象和实现Displayer的对象,然后将IntImpl的实例传递给两者。(无论如何,这更具有可伸缩性,因为它还允许您向每个值传递不同的值(如果需要的话)。)

代码语言:javascript
复制
class DisplayingAdder<T, A extends Adder<T>, D extends Displayer<T>> {
  final A adder;
  final D displayer;

  DisplayingAdder(this.adder, this.displayer);

  T addAndDisplay(T a, T b) {
    final r = adder.add(a, b);
    displayer.display(r);
    return r;
  }
}
代码语言:javascript
复制
void main() {
  final e1 = IntImpl();
  final da = DisplayingAdder(e1, e1);
  da.addAndDisplay(3,4);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59623147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档