Dart 中抽象静态方法的替代方法

毗湿奴

我需要一个抽象静态方法之类的东西,但由于我们不能在飞镖中做这样的事情,所以我正在寻找替代方案,我的情况是这样的:-

第一堂课:-

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章