솔리드 - LSP
Se q(x) é uma propriedade demonstrável dos objetos x de tipo T. Então q(y) deve ser verdadeiro para objetos y de tipo S onde S é um subtipo de T.
Se a nossa classe não pode se comportar como a classe que ela está herdando, então temos um problema de abstração.
예를 들면:
Temos uma classe Veículo, com um método voar() e temos uma classe Helicóptero que herda essa classe Veículo.
public class Veiculo
{
public string Nome { get; set; }
public virtual void Voar()
{
Console.WriteLine($"O veículo {Nome} está voando");
}
}
public class Helicoptero : Veiculo
{
}
Tudo certo, afinal um helicóptero é um subtipo de veículo eo helicóptero pode voar. Mas e se tivermos uma classe Moto herdando a classe Veículo, desta forma?
public class Moto: Veiculo
{
}
...
Veiculo moto = new Moto();
moto.Voar() //>>>>>>>>>> WTF!?
Uma moto é um veículo, porém não pode voar. 로고, estamos quebrando o princípio da substituição de Liskov.
해결책:
Tiramos o método voar()는 Veículo e criamos uma classe VeículoAéreo com o método voar() e então fazemos com que nossa classe Helicóptero herde a classe VeículoAéreo.
public class Veiculo
{
public string Nome { get; set; }
}
public class VeiculoAereo : Veiculo
{
public virtual void Voar()
{
Console.WriteLine($"O veículo {Nome} está voando");
}
}
public class Helicoptero : VeiculoAereo
{
}
public class Moto: Veiculo
{
}
Desta forma nem a moto e nem o helicóptero deixam de ser um veiculo, porem não é mais possível voar com a moto (nunca foi).
Criei uma classe LavaRapido com um método Lavar() que recebe um tipo de Veiculo
public class LavaRapido
{
public void Lavar(Veiculo veiculo)
{
Console.WriteLine($"Lavando o veiculo {veiculo.Nome}");
}
}
E assim consigo lavar meus dois veículos, mesmo que o helicóptero seja um veículo aéreo, pois a classe VeiculoAereo ainda é um subtipo de Veiculo.
var lavaRapido = new LavaRapido();
Veiculo moto = new Moto();
VeiculoAereo helicoptero = new Helicoptero();
lavaRapido.Lavar(moto);
lavaRapido.Lavar(helicoptero);
Reference
이 문제에 관하여(솔리드 - LSP), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gbarbosa/solid-lsp-6l5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)