Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Assistindo um hangout de princípio substituição de liskov inclusive é muito bom, com participação do joão batista
Em uma determinada hora do hangout eles falaram o seguinte sobre input e output:
INPUT(Entrada)
>
As classes derivadas não podem ser mais fortes em termos de input. E o que é ser mais forte? Não posso restringir a mais.. pq se eu colocar uma regra de restrição a mais na classe filha e não vou poder substituir esse negócio, por outra classe na hierarquia.
Exemplo:
Em um determinado cenário, um dos parâmetro de input(entrada) de uma classe é um inteiro, e a classe pai defini que esse inteiro só pode ser entre 1 a 10.. na classe filha então eu não posso restringir essa entrada por exemplo de 3 e 4, porem eu posso aumentar esse rand, como por exemplo a classe filha possa receber uma entrada de 1 a 15. Então o input ele não pode ser mais forte quando você desse a hierarquia.
OUTPUT(Saída)
>
Output e o reverso do input. O output das classes derivadas podem ser mais forte, do que a classe pai
Exemplo:
Em um determinado cenário, o output da classe pai tem que está entre 1 e 10, então por exemplo a minha classe filha pode está restrita de 3 a 5, e isso estaria respeitando o output da classe pai. Então no output as classes filhas podem ser mais restritas.
Bom.. na discussão do hangout um dos participantes, propôs o seguinte exemplo para análise, para se há ou não violação de LSP:
/*
Essa é a classe Base.. retorna estes tipos de array.
Os clientes que consomem essa classe estão esperando um retorno
de um array com index 'name' e 'age'
*/
class A
{
public function teste()
{
return ['name' => 'eu', 'age' => 15];
}
}
/*
Essa classe viola o principio LSP:
Foi adicionado um novo index no array, porem foi removido um index que a
classe Base definiu. Se um cliente acessar essa classe B e tentar acessar o index 'age'
vai dá erro, pois o cliente tinha a expectativa de que tivesse esse index 'age' no array
*/
class B extends A
{
public function teste()
{
return ['name' => 'eu', 'role' => 'Developer'];
}
}
/*
Essa classe não viola o principio LSP:
Foi adicionado mais um index no array, e não foi removido nenhum index que a classe base definiu.
pq aquilo que já esperado eu não posso remover no meu retorno.
*/
class C extends A
{
public function teste()
{
return ['name' => 'eu', 'age' => 15, 'role' => 'Developer'];
}
}
Ae eu fiquei meio que na dúvida, pois no caso do exemplo acima, a classe B ao me ver estaria sim obedecendo o output da classe pai, pois apesar da classe B remover o índice 'age', ela ainda continua com o index 'name'.. e no output como foi dito, ele pode ser mais
restritivo.. ou seja ele pode conter todos os index ou somente alguns index da classe base.
Então galera que manja no POO, estou falando besteira ou eu que não estou sabendo interpretar direito as coisas?
Alguém poderia me ajudar nessa dúvida?
Carregando comentários...