簡體   English   中英

定義一個具有參數化類型的泛型類,它期望在 dart 中有多個抽象類實現

[英]defining a generic class with parametrized type that expects more than one abstract class implementation in dart

接口

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);
}

一個恰好實現了所有三個的實現。

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}');
  }
}

需要支持其中兩個接口的使用者。 但是,我找不到如何聲明這樣的事情。

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;
  }
}

執行上述操作的代碼

void main() {
  final e1 = IntImpl();
  final da = DisplayingAdder(e1);
  da.addAndDisplay(3,4);
}

不確定可以更改什么以允許泛型參數聲明對多個抽象類的支持。

您不能將泛型類型限制為實現多個超類型的類型。 您要做的最好的事情是將engine分成一個實現Adder的對象和一個實現Displayer的對象,然后將IntImpl的實例IntImpl給兩者。 (無論如何,這更具可擴展性,因為它還允許您根據需要將不同的值傳遞給每個值。)

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;
  }
}
void main() {
  final e1 = IntImpl();
  final da = DisplayingAdder(e1, e1);
  da.addAndDisplay(3,4);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM