Este é o terceiro post sobre SOLID o liskov substitute principle.
Este principio é mais um complemento para boas práticas de desenvolvimento de software.
Quero ressaltar que: estes princípios você pode adaptar para qualquer linguagem de programação, onde você implemente o paradigma de orientação a objetos.
A definição deste princípio é a seguinte: Objetos em um programa devem ser substituídos por instâncias de seus subtipos sem alterar a funcionalidade do programa.
Em outras palavras, as classes estendidas não devem tornar mais restritas as regras da classe de onde ela estendeu os comportamentos.
Vamos a um exemplo clássico onde veremos a quebra deste princípio.
Pela matemática temos que o quadrado é um tipo de retângulo. Onde tem a característica de ter os 4 lados iguais.
Vejamos a implementação da classe quadrado estendendo o comportamento da classe retângulo.
class Retangulo { private $altura; private $largura; public function getAltura() { return $this->altura; } public function getLargura() { return $this->largura; } public function setAltura($valor) { $this->altura = $valor; } public function setLargura($valor) { $this->largura = $valor; } public function calcularArea() { return "A area é ". $this->getAltura() * $this->getLargura(); } } class Quadrado extends Retangulo { public function getAltura() { return $this->altura; } public function getLargura() { return $this->largura; } public function setAltura($valor) { $this->altura = $valor; $this->largura = $valor; } public function setLargura($valor) { $this->largura = $valor; $this->altura = $valor; } public function calcularArea() { return parent::calcularArea(); } }
Com está implementação de quadrado estendendo da classe retângulo temos a quebra do principio de liskov.