Какие есть варианты, чтобы заставить пользователей моего API реализовать метод stati c? - PullRequest
1 голос
/ 04 марта 2020

В настоящее время я использую шаблон BLo C для реализации функциональности firebase / firestore. Кажется обычным делом реализовать модель, сущность (которая в основном является моделью, хранящейся в базе данных) и репозиторий, который обрабатывает запросы программы.

Чтобы преобразовать модель в сущность и наоборот, для модели требуется метод toEntity и fromEntity. Я хочу, чтобы мой класс выглядел так:

@immutable
abstract class DatabaseModel {
  final id;
  DatabaseEntity toEntity();

  DatabaseModel({@required this.id});

  static DatabaseModel fromEntity(DatabaseEntity entity);
}

Однако это невозможно. Dart не допускает методы stati c без тела функции, как указано в Можно ли объявить метод stati c в абстрактном классе в Dart? , основываясь на том факте, что методы stati c в любом случае не наследуются.

Я думал о реализации метода fromEntity как метода-члена модели DatabaseModel с дополнительным методом stati c, который вызывает метод-член, например:

abstract class DatabaseModel {
  final id;
  DatabaseEntity toEntity();

  DatabaseModel({@required this.id});

  static DatabaseModel createFromEntity(DatabaseEntity entity, DatabaseModel instance) {
    return instance.fromEntity(entity);
  }

  DatabaseModel fromEntity(DatabaseEntity entity);
}

Но из-за следующих недостатков я решил не использовать этот метод:

  1. Класс наследования больше не может быть @immutable
  2. Создание нового экземпляра на самом деле не является прямо вперед, поскольку, например, объект class YouTubeComment будет создан как этот - DatabaseModel.createFromEntity(entity, YouTubeComment()).
  3. Это требует, чтобы наследующий класс реализовал пустой конструктор для создания экземпляра.

Поскольку невозможно реализовать метод stati c или соответствующий конструктор, Есть ли способ сообщить разработчику, что он предназначен для реализации метода stati c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...