Являются ли методы конструктора в интерфейсах плохими?
Методы конструктора в интерфейсах
Ответ 1
Почему люди думают, что кто-то хочет создать экземпляр интерфейса?
Мы хотим заставить разработчиков реализовать конструктор, как и другие методы интерфейса.
Интерфейс подобен контракту. Скажем, у меня есть интерфейс Queue, и я хочу убедиться, что разработчики создают конструктор с одним аргументом, который создает одиночную очередь (новая очередь только с этим элементом). Почему это не должно быть частью контракта? По крайней мере с интерфейсами Java, которые не могут быть указаны.
Ответ 2
Они плохи в том, что они не имеют никакой цели. По своей сути, интерфейс - это просто договор передачи данных. Никакой реализации с интерфейсом не существует, и, следовательно, нет ничего, чтобы инициализировать и не требовать конструктора.
Если вам нужна какая-то инициализация, вам гораздо лучше использовать абстрактный класс.
Ответ 3
Во-первых, я не согласен, что интерфейс - это просто договор передачи данных. Если это правда, вам будет разрешено определять свойства в интерфейсе.
Я бы не подумал, что это странно делать что-то вроде:
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);
}
Это позволит вам создавать экземпляры сторонних классов для доступа к данным на основе простого отражения вместо того, чтобы просто быть контрактом данных.
Я уверен, что это не лучший пример, я бы пошел на абстрактный базовый класс здесь, в реальном мире, но я также уверен, что есть вполне веские причины для определения методов конструктора 'контракт в интерфейсе, о котором я не думал.
Я не видел этого, но я бы не подумал, что это странно или плохо.
Ответ 4
Хотя интерфейсы не могут иметь конструкторы в большинстве языков, Factory pattern предоставляет контракт на создание объектов, аналогичный интерфейсу, Взгляните на это.
Ответ 5
Являются ли они плохими, я не знаю ни одного языка, который имеет возможность указать конструктор на интерфейсе.
Тем не менее, я лично не считаю, что конструктор объекта является частью этого объектного интерфейса, и поэтому добавление конструктора к интерфейсу будет препятствовать естественной гибкости, доступной для интерфейса.