Соответствует ли код принципу подстановки Лискова?

Я тестирую свой существующий код на PHP5.4 перед обновлением. Я обнаружил, что следующий код больше не работает, потому что PHP ужесточил свою модель наследования. Из-за этого ужесточения я читал про SOLID, а конкретно принцип подстановки Лисков(я программист-самоучка), чтобы я мог улучшать свой код и не страдать от будущие "затяжки".

interface IComparable {
    public function equals(self $other);
}

class A implements IComparable{
    protected $var;

    public function __construct($v){
        $this->var=$v;
    }

    public function equals(self $other){
        return ($this->var == $other->var) ? 'equal' : 'different';
    }
}

$a1= new A(7);
$a2= new A(5);
$a3= new A(5);

echo $a1->equals($a2),"\n";
echo $a2->equals($a3),"\n";

Результат php 5.3:

  • разные
  • равные

Результат php 5.4:

Неустранимая ошибка PHP: объявление A::equals() должно быть совместимо с IComparable::equals(IComparable $other)

Я могу избежать ошибки php5.4, если напишу код таким образом:

interface IComparable {
    public function equals($other);
}

class A implements IComparable{
    protected $var;

    public function __construct($v){
        $this->var=$v;
    }

    public function equals($other){
        if(get_class($other) != get_class($this)) return false;
        return ($this->var == $other->var) ? 'equal' : 'different';
    }
}

но соответствует ли исправление принципу подстановки Лисков, так как функция очевидно не будет принимать любой тип аргумента? И если это не так, как я могу написать наследуемую функцию, которая будет делать то, что мне нужно — сравнивать 2 объекта одного типа — и соответствовать хорошим принципам OOD?

5
задан hakre 28 April 2013 в 23:22
поделиться