В настоящее время я использую шаблон 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);
}
Но из-за следующих недостатков я решил не использовать этот метод:
- Класс наследования больше не может быть
@immutable
- Создание нового экземпляра на самом деле не является прямо вперед, поскольку, например, объект
class YouTubeComment
будет создан как этот - DatabaseModel.createFromEntity(entity, YouTubeComment())
. - Это требует, чтобы наследующий класс реализовал пустой конструктор для создания экземпляра.
Поскольку невозможно реализовать метод stati c или соответствующий конструктор, Есть ли способ сообщить разработчику, что он предназначен для реализации метода stati c