[英]Can you use an abstract class to construct a generic?
我试图在泛型上使用构造函数,但由于泛型(这里用 T 表示)可以是任何我试图让 T 成为“RedClass”类型的东西。 如果我然后传递一个类来表示也扩展了“RedClass”的 T,我将能够在 T 上使用 RedClass 构造函数,对吗?
abstract class RedClass {
RedClass();
RedClass.fromJson(Map<String, dynamic> json)
}
class BlueClass extends RedClass {
BlueClass();
}
class FinalClass<T extends RedClass> {
// Inside FinalClass I can create a BlueClass from the generic T
final happyBlueClass = T.fromJson(someJson)
}
// When creating the FinalClass i pass a class that also extends RedClass
return FinalClass<BlueClass>()
但是尝试这个通用 T 似乎无法访问任何 .fromJson() 构造函数。 有任何想法吗?
谢谢大家的建议。 对此,我真的非常感激。
我现在的解决方案是使 FinalClass 的 T 尽可能通用,我需要使用小部件树中较早的提供程序将构造函数传递给 FinalClass。
class FinalClassDataBuilder {
final Type model;
final Function builder;
FinalClassDataBuilder({this.model, this.builder});
}
class FinalClassProvider extends StatelessWidget {
final Widget child;
final List<FinalClassDataBuilder> modelbuilderList;
const FinalClassProvider({Key key, this.child, this.modelbuilderList})
: super(key: key);
@override
Widget build(BuildContext context) {
return Provider<List<FinalClassDataBuilder>>(
create: (_) => [...modelbuilderList],
child: child,
);
}
}
class FinalClass<T> {
...
final List<FinalClassDataBuilder> builders =
Provider.of<List<FinalClassDataBuilder>>(context);
final List<<FinalClassDataBuilder>> result = builders
.where((datamodel) => datamodel.model.toString() == T.toString())
.toList();
}
没有办法直接做你想做的事情。
你不能在类型变量上调用静态方法,只能在它们实际声明的类/混合/扩展上调用。静态方法需要在编译时静态地知道,以便被调用。
如果要创建类型变量的实例,则需要向类传递这样做的方法。 也许:
class FinalClass<T extends RedClass> {
final T Function(dynamic) _fromJson;
FinalClass(T Function(dynamic) fromJson) : _fromJson = fromJson;
void someMethod(someJson) {
...
var happyBlueClass = _fromJson(someJson);
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.