Как заставить конструктор возвращать подклассный объект - PullRequest
2 голосов
/ 16 июля 2010

Я только что прочитал книгу о шаблонах объектно-ориентированного программирования. Он описывает шаблон Factory, с помощью которого вы можете вызвать статический метод фабрики объекта, и объект вернет новый объект ожидаемого типа, но он будет соответствующим образом разделен на подклассы.

Мой вопрос, может ли эта функциональность быть предоставлена ​​конструктором для класса? Если так, то как? Я не знаю почему? Представьте, что у меня есть класс VillagePerson, у которого есть подклассы PoliceOfficer, NativeAmerican, Cowboy, Biker, ConstructionWorker и Sailor. Конструктор берет текстовое строковое описание человека, анализирует его и возвращает определенный тип человека, которого я хочу. Это возможно только при статических фабричных методах?

Ответы [ 2 ]

3 голосов
/ 16 июля 2010

Нет. Обычно конструктор - это функция, которая автоматически вызывается языком для инициализации создаваемого объекта. Само по себе это означает, что конструктор не может предоставить функциональность фабрики «позвони мне, чтобы создать объект».

Кроме того, конструкторы обычно вызываются из выражений типа new ClassName(args), которые в большинстве языков определены как создающие экземпляр ClassName, а не из класса, который наследуется от ClassName. Таким образом, вы не можете использовать new или конструкторы для создания экземпляров любого типа.

С другой стороны, я сказал « в большинстве языков »: некоторые, например JavaScript, позволяют возвращать все что угодно из конструктора, а другие, например Objective Caml, рассматривают конструкторы как фабрики функции.

1 голос
/ 16 июля 2010

Это парафраз комментария Стивена Судита

Создать класс Proxy поверх VillagePerson:

  • Прокси-сервер реализует тот же интерфейс, что и VillagePerson, но не наследует от него никакого кода реализации.
  • Прокси-сервер содержит ссылку _vpImpl на подклассный объект VillagePerson.
  • Когда методвызывается на Прокси, Прокси просто передает вызов объекту * 1017. *

Чтобы создать подкласс VillagePerson, конструктор Прокси может вызвать определенный конструктор подкласса и затем сохранитьэто в _vpImpl.

...