C # Какой шаблон использовать для создания типа на основе разных типов? - PullRequest
0 голосов
/ 30 марта 2011

У меня есть три разных объекта, которые действуют как входные данные для создания объекта A. Три разных объекта:

  • DataRow
  • объект A (когда я хочу создать копию)
  • Объект B (выглядит как объект A, но отличается и не является подтипом)

Теперь у меня есть статический метод для объекта A, который выглядит следующим образом:

public class ObjectA
{
   // class code

   public static ObjectA CreateFromType(DataRow row) {/*implementation */}
   public static ObjectA CreateFromType(ObjectA obj) {/*implementation */}
   public static ObjectA CreateFromType(ObjectB obj) {/*implementation */}
}

Это хороший способ?Это запах кода, который нарушает OCP?Как бы вы это реализовали?

Ответы [ 4 ]

3 голосов
/ 30 марта 2011

Почему бы просто не создавать различные конструкторы на ObjectA?Или явные или неявные операторы?Я не вижу необходимости в статических методах в вашем случае.

3 голосов
/ 30 марта 2011

Почему бы не предоставить соответствующие конструкторы вместо фабричных методов? Есть ли четвертый сценарий, в котором ObjectA может быть «создан по умолчанию»?

Конструкторы обладают определенным преимуществом в качестве подхода в том, что они являются наиболее видимой частью открытого интерфейса ObjectA, когда кто-то собирается его создать. Если основной сценарий для экземпляров должен быть создан одним из упомянутых вами способов, я настоятельно рекомендую конструкторы.

Специальное упоминание для конструктора "клон": если в вашей сборке есть другие классы, которые можно клонировать, возможно, имеет смысл определить собственную производную IClonable, а также с четко определенной семантикой (мелкий или глубокий клон) и используйте этот подход вместо конструктора копирования.

2 голосов
/ 30 марта 2011

выглядит нормально, хотя вы также можете использовать конструкторы

public class ObjectA
{
   // class code

   public ObjectA(DataRow row) {/*implementation */}
   public ObjectA(ObjectA obj) {/*implementation */}
   public ObjectA(ObjectB obj) {/*implementation */}
}
0 голосов
/ 30 марта 2011

Может ли ObjectA создаваться самостоятельно и инициализироваться независимо?Я был бы склонен оставить ваш конструктор лишенным этой передачи данных, и вместо этого создать объектные методы для инициализации данных для ваших 3 различных сценариев.

Это также повышает гибкость, если вы хотите наследовать от ObjectA и специализировать данныепередачи.

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