接口
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);
}不确定可以更改什么以允许泛型参数声明对多个抽象类的支持。
发布于 2020-01-07 06:40:26
不能将泛型类型限制为实现多个超级类型的类型。最好的方法是将engine分离为实现Adder的对象和实现Displayer的对象,然后将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);
}https://stackoverflow.com/questions/59623147
复制相似问题