Дженерики с общим методом

#dart #flutter

#dart #флаттер

Вопрос:

Я пытался написать абстрактный JsonSerializable класс, чтобы иметь что-то вроде этого:

 abstract class JsonSerializable<T>{
    T fromMap(Map<String,dynamic> map);
    Map<String,dynamic> toMap();
    T fromJsonString(String jsonString){
        return fromMap(json.decode(jsonString));
    }
    String toJsonString(){
        return json.encode(toMap());
    }
}
  

Моя первая проблема заключалась в том, что fromMap и fromJsonString не могут использоваться в качестве конструкторов, поэтому я подумал, что это может сделать что-то вроде этого:

 class Foo extends JsonSerializable<Foo>{

  Foo();
  factory Foo.fromMap(Map<String,dynamic> map){
    return fromMap(map);  
  }

  @override
  Foo fromMap(Map<String, dynamic> map) {
    // TODO: implement fromMap
    return null;
  }

  @override
  Map<String, dynamic> toMap() {
    // TODO: implement toMap
    return null;
  }
}
  

Теперь приведенный выше код вызывает жалобу Dart analyzer, поскольку я пытаюсь получить доступ к методу экземпляра из конструктора factory.

Итак, я подумал, что мог бы просто реализовать эти методы, не наследовая и не переопределяя их (я знаю, это грязное решение), но все же это не даст мне чего-то, что могло бы просто сказать: «Эй, у такого класса есть этот метод».

Я полностью упускаю смысл в этом?
Существует ли чистое решение, которое не включает плагины для генерации кода, которые, по-видимому, не поддерживают дженерики?

Мои ответы API имеют всю эту структуру:

 {
    "key1":"value1",
    "otherStuffKey":["blah", "blah"],
    "data": <the object I want to generalize>
}
  

Мне нужны дженерики, потому что я хотел бы проанализировать объект, сериализованный как data значение, в разные классы, которые имеют одинаковое поведение.

PS: Методы toMap and toJsonString бесполезны, если я собираюсь проанализировать ответ, но они были бы очень полезны для завершения круга и позволяют использовать это JsonSerializable и для сериализации запросов.

Комментарии:

1. что вы имеете в виду?

2. о, да, я знаю, на самом деле это одна из моих проблем