Архитектурное решение: абстракция для похожих классов со статическими методами
У меня есть несколько похожих классов, каждый из которых должен уметь сериализовываться и десериализовываться по некоторым правилам, и я не совсем понимаю, как лучше это организовать.
Мне понравилась идея "приватизации" конструктора и создания экземпляров статическим методом класса этого класса из строки, например так:
var instance = MyClass.CreateFromString(s);
Наверное, это какой-то паттерн, но я забыл, как он называется (будет здорово, если кто-то напомнит). Это используется для десериализации.
Сериализация может вызываться просто каким-нибудь перегруженным ToString().
Похожих классов несколько, поэтому хочется закрыть их под какой-нибудь абстракцией (интерфейсом), но в интерфейсы не могут объявлять статические методы класса (в некоторых языках есть инструменты для такой задачи, например, в свифт есть протоколы). С абстракцией проще работать, потом можно создать какую-нибудь "фабрику" или нечто подобное, чтобы передавать в параметры тип и строку, а она мне рождала нужный объект.
Пишу на C#
P.S. Наверное, стоит пояснить, почему хочется закрыть абстракцией: если мне понадобится добавить еще классы такого же вида, то очень хотелось бы всю логику прописать внутри нового класса, ничего больше не исправляя (DRY). При этом желательно иметь какие-то жесткие ограничения (как те, что накладывают интерфейсы), чтобы не было возможности написать такой класс "от балды"
Ответы (1 шт):
Решение нашел. Можно сделать так:
public interface IMyClass<T> where T : IMyClass<T>
{
static abstract T CreateObjectFromString(string s);
}
Класс MyClass, соответственно, должен реализовывать интерфейс IMyClass<MyClass>
Эта возможность называется Preview Features и она доступна с версии .NET 5.0, также для ее использования нужно включить в файл .csproj проекта <EnablePreviewFeatures>true</EnablePreviewFeatures>