Должны ли конструкторы соблюдать принцип замены Лискова? [закрытый]
Я обычно стараюсь, чтобы мои экземпляры объектов соответствовали Принцип Подстановки Лискова, но я всегда задавался вопросом, считают ли люди, что LSP должен применяться и к конструкторам?
Я пробовал гуглить для этого, но я не смог найти никаких сильных мнений в любом случае.
Я должен отметить, что большая часть моего кодирования находится в Ruby, но я иногда нахожу, что мои конструкторы подкласса немного отличаются от родительского класса. Они берут то же самое базовый набор аргументов, и часто дополнительные аргументы. Иногда это также происходит с другими методами класса.
в глубине моей головы это всегда было похоже на нарушение LSP, но я хотел посмотреть, чувствует ли кто-нибудь еще это тоже.
3 ответа:
нет, когда вы используете конструктор, вы знаете, что имеете дело с подтипом. Это позволяет иметь предварительные условия, не необходимые для родительского конструктора, такие как другие параметры. Вот почему в большинстве языков имя конструктора - это имя создаваемого класса.
хороший пример того, как это это
ColoredSquare
может быть подтипомSquare
, но требуется дополнительный параметр:color
. Если бы вы не могли делать такие вещи, как этот подтип было бы намного меньше полезный.в некотором смысле конструктор на самом деле не является частью типа: это функция, которая возвращает элемент этого типа. Таким образом, определение нового конструктора для подтипа не нарушает LSV.
Наверняка Нет.
конструкторы, как правило, специализируется на подтипы. Попытка применить LSP к конструкторам будет похожа на то, что подтипы не могут добавлять определенные методы или члены. Но ограничение только наоборот.
и я также согласен с Филиппом, конструкторы на самом деле не являются частью типа (и в некоторых языках вы можете легко использовать другие фабрики вместо конструкторов). Используя терминологию smalltalk, вы бы сказали, что конструкторы-это методы мета-классы.
здесь нет нарушения LSP, он применяется только к методам экземпляра, а не к методам класса (конструкторы или любые другие методы класса).
Это своего рода самоуверенный вопрос, но способ, которым я обычно пишу свой, таков, что дополнительные параметры не имеют реального отношения к изменению функциональности. Под этим я подразумеваю, что когда мой конструктор требует дополнительного параметра в подклассе, он должен поддерживать стандартную функциональность (но делать разные базовые вещи) таким образом, скажем, я создаю ClassA = new ClassB (с некоторыми args); тогда функциональность одинакова, делаю ли я это или ClassA = new ClassA(); и я обычно использую какой-то вид из Заводского метода, чтобы создать их, так что это бесшовные в том, как они работают. Опять же, это просто то, как я делаю вещи, и никоим образом не является абсолютно правильным способом делать вещи.