Одним из рекомендуемых принципов объектно-ориентированного программирования является принцип замещения Лисков: подкласс должен вести себя так же, как его базовый класс(ы) (предупреждение: это на самом деле не правильное описание принципа Лискова: см. PS).
Рекомендуется ли применять его также к конструкторам? В основном я имею в виду Python и его __init__()
методы, но этот вопрос относится к любому объектно-ориентированному языку с наследованием.
Я задаю этот вопрос, потому что иногда полезно иметь подкласс, наследуемый от одного или нескольких классов, которые обеспечивают хорошее поведение по умолчанию (например, наследование от словаря в Python, так что obj['key']
работает для объектов нового класса). Однако не всегда естественно и просто разрешать использовать подкласс точно так же, как словарь: иногда было бы лучше, чтобы параметры конструктора относились только к конкретному пользовательскому подклассу (например, к классу, представляющему набор последовательных портов). может захотеть вести себя как словарь, где ports['usb1']
является USB-портом № 1 и т. д.). Каков рекомендуемый подход в такой ситуации? иметь конструкторы подклассов, которые полностью совместимы с конструкторами их базовых классов, и генерировать экземпляры с помощью функции фабрики объектов, которая принимает простые, удобные для пользователя параметры? или просто написать конструктор класса, набор параметров которого нельзя напрямую передать конструктору его базовых классов, но который более логичен с точки зрения пользователя?
PS: я неправильно истолковал принцип Лискова выше: комментарий Свена ниже указывает на тот факт, что объекты подкласса должны вести себя как объекты суперкласса (сам подкласс не имеет вести себя как суперкласс; в частности, их конструкторы не обязательно должны иметь одинаковые параметры [сигнатура]).