Являются ли методы конструктора в интерфейсах плохими?
Почему люди думают, что кто-то хочет создать интерфейс?
Мы хотим заставить разработчиков реализовать конструктор, как и другие методы интерфейса.
Интерфейс подобен контракту. Предположим, у меня есть интерфейс Queue, и я хочу убедиться, что разработчики создают конструктор с одним аргументом, который создает одиночную очередь (новая очередь только с этим элементом). Почему это не должно быть частью контракта? По крайней мере, с интерфейсами Java, которые не могут быть указаны.
Они плохи в том, что они не имеют никакой цели. По своей сути, интерфейс – это просто договор передачи данных. Никакой реализации с интерфейсом не существует, и, следовательно, нет ничего, чтобы инициализировать и не требовать конструктора.
Если вам нужна какая-то инициализация, вам гораздо лучше использовать абстрактный класс.
Хотя интерфейсы не могут иметь конструкторы на большинстве языков, шаблон Factory предоставляет контракт на создание объектов, аналогичный интерфейсу. Взгляните на это.
Во-первых, я не согласен, что интерфейс – это просто договор передачи данных. Если это правда, вам будет разрешено определять свойства в интерфейсе.
Я бы точно не подумал, что это странно делать что-то вроде:
interface IDBConnection { function __construct( $connectionString ); function executeNonQuery( $commandText, $paramters=null); function executeScalar( $commandText, $paramters=null); function executeSingle( $commandText, $paramters=null); function executeArray( $commandText, $paramters=null); }
Это позволит вам создавать экземпляры сторонних классов для доступа к данным на основе простого отражения вместо того, чтобы просто быть контрактом данных.
Я уверен, что это не лучший пример, я бы пошел на абстрактный базовый класс здесь, в реальном мире, но я также уверен, что существуют вполне веские причины для определения контракта на методы конструктора в интерфейс, о котором я не думал.
Я этого не видел, но я бы не подумал, что это странно или плохо.
Независимо от того, плохо они или нет, я не знаю ни одного языка, который может указать конструктор интерфейса.
Однако, как мне кажется, я лично не считаю, что конструктор объекта является частью интерфейса этого объекта, и поэтому добавление конструктора к интерфейсу будет препятствовать естественной гибкости, доступной для интерфейса.