Производный объект Java LSP может заменить базовый объект

Что касается принципа замены Лискова (LSP), в нем говорится, что объект производного класса может заменить объект базового класса без сбоя выполнения программы.

Что, если мой родительский класс является абстрактным базовым классом с функцией:

public abstract class BaseClass {
    public void heal() {
        health++;
    }
}

Могу ли я переопределить метод лечения в производном классе, и он по-прежнему действителен для принципа LSP, например:

public class ChildClass extends BaseClass {
   @Override public void heal() {
   super.heal();
   super.heal();
}

Programm все еще будет выполняться, и я могу передать объекты ChildClass методу, который ожидает объект BaseClass в качестве параметра. Однако два метода heal() ведут себя немного по-разному.

Могу ли я перезаписать конкретные методы абстрактных базовых классов в их дочерних классах без ущерба для LSP?


person octavio    schedule 10.01.2016    source источник


Ответы (1)


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

Если ваш метод heal задокументирован как «Добавить одну точку к работоспособности объекта», то другие классы, использующие ваш BaseClass, полагаются на добавление только одной точки. В этом случае переопределение heal для добавления любой другой суммы к работоспособности нарушает контракт и нарушает LSP.

И наоборот, если heal — это метод, который «добавляет несколько очков к здоровью объекта», то другим классам не разрешается делать какие-либо предположения о том, какова на самом деле добавленная сумма — единственное, на что они могут полагаться, это, например, что health после вызова этого метода не меньше health до вызова heal. В этом случае ваше переопределение не нарушает LSP и не ломает программу.

person Oleg Andriyanov    schedule 10.01.2016