[英]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.