【问题标题】:Dart: generics abstract static methodsDart:泛型抽象静态方法
【发布时间】:2019-07-25 17:25:18
【问题描述】:

亲爱的

我想要具有以下模式的抽象泛型类 我的手机型号如下:

  class Phone extends ModelInterface {
  ...

  @override
  static dynamic getErrorInstance(Map<String, dynamic> map) {
    return Phone.fromErrors(map);
  }

  @override
  static dynamic getResponseInstance(Map<String, dynamic> map) {
    return Phone.fromMap(map);
  }
}

如您所见,Phone 模型扩展了 ModelInterface,并且有两个重写方法 getErrorInstancegetResponseInstance

这两个方法在ModelInterface抽象类中定义为静态

abstract class ModelInterface {
  static dynamic getErrorInstance(Map<String, dynamic> map) {}
  static dynamic getResponseInstance(Map<String, dynamic> map) {}
}

我想做的是创建一个基于响应类型构建对象的通用方法,如下所示

abstract class Base {
  ...

  T getModel<T extends ModelInterface>(Map<String, dynamic> map) {
    if (hasErrors(map)) {
      return T.getErrorInstance(map);
    }

    return T.getResponseInstance(map);
  }
}

这个方法的客户端getModel如下所示

class UserAuth extends Base {
  Future<Phone> registerPhone(Phone phone) async {
    String url = Routes.phoneUrl;
    String body = json.encode(phone.toMap());
    final response = await http.post(url, body: body, headers: Routes.headers);
    final responseBody = json.decode(response.body);
    // here I want the generic type to be phone
    return getModel<Phone>(responseBody);
  }
}

但是我得到了这个错误

谢谢

【问题讨论】:

  • 你不能覆盖静态方法。
  • @Tidder 我将如何处理上述问题

标签: oop dart


【解决方案1】:

实际上我通过传入另一个通用参数来修复它,如下所示

  T getModel<T extends ModelInterface>(Map<String, dynamic> map, T) {
    if (hasErrors(map)) {
      return T.getErrorInstance(map);
    }

    return T.getResponseInstance(map);
  }

对于客户端代码,我添加了以下内容

class UserAuth extends Base {
  Future<Phone> registerPhone(Phone phone) async {
    String url = Routes.phoneUrl;
    String body = json.encode(phone.toMap());
    final response = await http.post(url, body: body, headers: Routes.headers);
    final responseBody = json.decode(response.body);

    return getModel<Phone>(responseBody, Phone.empty());
  }
}

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 2012-01-02
    • 2023-02-01
    • 1970-01-01
    • 2018-07-05
    • 2019-10-10
    • 1970-01-01
    • 2012-12-03
    • 2012-12-04
    相关资源
    最近更新 更多