Я не был полностью доволен объяснением Мейсона, поэтому я сделал небольшое исследование.
Я обнаружил, что существуют две основные причины, по которым разработчики языка предпочитают опускать наследование конструктора, к которым я могу лучше относиться.
Первой причиной является управление версиями - если новый конструктор вводится в базовый класс или если в базовом классе изменяется подпись конструктора, подклассы наследуют эти изменения, что может привести к непредсказуемым побочным эффектам ,
Эта проблема часто возникает в рамках различных типов, где часто часть API-интерфейса фреймворка состоит из классов, которые вы ожидаете расширить, или абстрактных классов для реализации - если подписи конструктора меняются в рамках класс, вы бы наследовали те изменения, которые большую часть времени не имеют смысла. Это называется проблемой «Fragile Base Class».
Вторая причина - более философская сторона и тесно связана с первым. Конструкторы определяют, что ваш класс требует от вас, как потребителя этого класса, когда вы создаете экземпляр - так что о требуется самого класса. Сравните это с методами, которые определяют фактическое поведение класса - это то, что делает класс . Исходя из этого, философский аргумент состоит в том, что наследование составляет примерно поведение, а не о .
Эти два аргумента на самом деле две стороны одной медали: возможно, наследование конструктор является хрупким потому конструкторы определяют потребности одного класса - например, это не разумно ожидать, автор базового класса чтобы иметь возможность прогнозировать все потребности вашего расширенного класса.
Или, по крайней мере, делает это предположение (как это делают некоторые языки) будет ограничивать полезность базового класса значительно, так как вы только сможете ввести новый поведение в своем расширенном классе, никогда любой новой требуется.
Другая вещь, которая пришла мне в голову, - вопрос полноты - это вопрос личных предпочтений, но в языках, наследующих конструкторы, я часто нахожу, что вам нужно много копаться в базовых классах, чтобы узнать и понять все разные способы создания экземпляра данного класса.
Если конструкторы не могут быть унаследованы, это заставляет автора любого класса быть явным обо всех способах, по которым предполагается построить экземпляр класса, даже если некоторые из этих конструкторов будут полностью тривиально, тот факт, что они определены в самом классе, демонстрирует, что автор этого класса считал их полезными и должен был понимать и учитывать все потребности базового класса, которые, возможно, были написаны другим автором.
В отличие от слепого наследования потребностей базового класса, без активного демонстрации каких-либо соображений относительно соответствия потребностей базового класса требованиям расширенного класса.
На практике я нахожу, что потребности не выравниваются. Но даже когда они выравниваются, их заставляют думать о том, как они выравниваются, приводят к более высокому качеству кода, и я считаю, что это философия, по которой разработчики языка выбирают не наследование конструкторов - в конце концов, язык является только хорошим как код, который записывается в нем.
его заставляет вас научиться печатать быстрее ... –