Должны ли конструкторы соблюдать принцип замены Лискова? [закрытый]


Я обычно стараюсь, чтобы мои экземпляры объектов соответствовали Принцип Подстановки Лискова, но я всегда задавался вопросом, считают ли люди, что LSP должен применяться и к конструкторам?

Я пробовал гуглить для этого, но я не смог найти никаких сильных мнений в любом случае.

Я должен отметить, что большая часть моего кодирования находится в Ruby, но я иногда нахожу, что мои конструкторы подкласса немного отличаются от родительского класса. Они берут то же самое базовый набор аргументов, и часто дополнительные аргументы. Иногда это также происходит с другими методами класса.

в глубине моей головы это всегда было похоже на нарушение LSP, но я хотел посмотреть, чувствует ли кто-нибудь еще это тоже.

3 53

3 ответа:

нет, когда вы используете конструктор, вы знаете, что имеете дело с подтипом. Это позволяет иметь предварительные условия, не необходимые для родительского конструктора, такие как другие параметры. Вот почему в большинстве языков имя конструктора - это имя создаваемого класса.

хороший пример того, как это это ColoredSquare может быть подтипом Square, но требуется дополнительный параметр:color. Если бы вы не могли делать такие вещи, как этот подтип было бы намного меньше полезный.

в некотором смысле конструктор на самом деле не является частью типа: это функция, которая возвращает элемент этого типа. Таким образом, определение нового конструктора для подтипа не нарушает LSV.

Наверняка Нет.

конструкторы, как правило, специализируется на подтипы. Попытка применить LSP к конструкторам будет похожа на то, что подтипы не могут добавлять определенные методы или члены. Но ограничение только наоборот.

и я также согласен с Филиппом, конструкторы на самом деле не являются частью типа (и в некоторых языках вы можете легко использовать другие фабрики вместо конструкторов). Используя терминологию smalltalk, вы бы сказали, что конструкторы-это методы мета-классы.

здесь нет нарушения LSP, он применяется только к методам экземпляра, а не к методам класса (конструкторы или любые другие методы класса).

Это своего рода самоуверенный вопрос, но способ, которым я обычно пишу свой, таков, что дополнительные параметры не имеют реального отношения к изменению функциональности. Под этим я подразумеваю, что когда мой конструктор требует дополнительного параметра в подклассе, он должен поддерживать стандартную функциональность (но делать разные базовые вещи) таким образом, скажем, я создаю ClassA = new ClassB (с некоторыми args); тогда функциональность одинакова, делаю ли я это или ClassA = new ClassA(); и я обычно использую какой-то вид из Заводского метода, чтобы создать их, так что это бесшовные в том, как они работают. Опять же, это просто то, как я делаю вещи, и никоим образом не является абсолютно правильным способом делать вещи.