简体   繁体   中英

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

interfaces

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

An implementation that just happens to implement all three.

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

A consumer that needs support for two of the interfaces. But, I could not find how to declare such a thing.

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

Code to exercise the above

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

Not sure what can be changed to allow the generic parameter to declare support for more than one abstract class.

You can't restrict a generic type to a type that implements multiple supertypes. The best you're going to have to do is separate engine into an object that implements Adder and an object that implements Displayer , then pass the instance of IntImpl to both. (This is more scalable anyway since it also allows you to pass different values to each if you wanted.)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM