我需要一个抽象静态方法之类的东西,但由于我们不能在飞镖中做这样的事情,所以我正在寻找替代方案,我的情况是这样的:-
第一堂课:-
abstract class Parent {
static String get name;
static Parent fromSecretText(String name);
}
class ChildFirst {
static String get name => 'first_child'; //note:- here it is not the typename
static ChildFirst fromSecretText(String name) {
// generate object
}
}
class ChildSecond {
static String get name => 'second_child';
static ChildSecond fromSecretText(String name) {
// generate object
}
}
现在我需要这样的方法:-
Future<List<T>> getMultiple<T extends Parent>() async {
final List<String> secretKeys = await getSecretKeys(T.name);
List<T> res = [];
for (var secretKey in secretKeys) res.add(T.fromSecretText(secretKey));
return res;
}
你不能在 Dart 中做到这一点。
类声明的静态成员就是:声明上的方法,它被视为用于查找的命名空间。
静态成员与类引入的类型无关。当类是泛型时,这一点更加明显,因为类声明引入了多种类型,每个泛型实例化一个,但静态方法对此一无所知。
一个类型参数,就像<T extends Parent>
这里,抽象了type。无法从类型访问静态方法,您需要声明的实际名称。
您可以做的是让类由策略对象表示。
abstract class SecretStrategy<T> {
String get name;
T fromSecretText(String name);
}
/// Maybe implemented like
class _SecretStrategy<T> implements SecretStrategy<T> {
final String name;
final T Function(String name) _fromSecretText;
_SecretStrategy(this.name, this._fromSecretText);
T fromSecretText(String name) => _fromSecretText(name);
}
然后你的类可以定义自己的策略:
class Person {
static final SecretStrategy<Person> secretStrategy =
_SecretStrategy<Person>(name, fromSecretText);
...
}
class ChildFirst {
static final SecretStrategy<ChildFirst> secretStrategy =
_SecretStrategy<ChildFirst>(name, fromSecretText);
...
}
// etc
然后你的辅助函数将是:
Future<List<T>> getMultiple<T>(SecretStrategy<T> strategy) async {
final List<String> secretKeys = await getSecretKeys(strategy.name);
return [for (var key in secretKeys) strategy.fromSecretText(key)];
}
你可以称之为:
var result = await getMultiple(FirstChild.secretStrategy);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句