Я обнаружил, что у меня неправильный дизайн, и спросил, как решить мою проблему.
Итак, мой случай:
Я пишу фабричный метод, для классов ведьма была получена из моего специальногоБазовый класс.Поэтому я написал
public T MyFactory<T>() where T:MyBaseClass
Но моя основная работа моего фабричного метода - получить некоторые специальные параметры и передать их конструктору нового объекта.MyBaseClass
имеет этот конструктор:
public MyBaseClass(MySpecParam param){...}
Но нет никакой гарантии, что тип T
, полученный из MyBaseClass
, имеет такой конструктор.
Единственное решение, которое я вижу,состоит в том, чтобы добавить new()
ограничение и виртуальный Init
метод к MyBaseClass
, чтобы фабрика смогла создать новый объект типа T
, а затем инициировать его с MySpecParam
object.
Но у MyBaseClass
такой дизайн, поэтому он совершенно непригоден, если не введен с MySpecParam
.И пользователь может создать MyBaseClass
с помощью конструктора без параметров и получить совершенно недействительный, не инициализированный объект.Я думаю, что это нехорошо.
Нет способа добавить ограничение new(MySpecParam)
.
Как я должен проектировать свои объекты, конструкторы и метод фабрики?