Я реализую Шаблон стратегии для реализации поведения различных типов уток. Вот код:
public interface IFlybehaviour
{
public void fly();
}
public class GeneralFlybehaviour
{
public void fly()
{
Console.WriteLine("I can fly as a duck");
}
}
public abstract class Duck
{
IFlybehaviour flybehaviour;
Duck()
{
}
public void PerformFly()
{
flybehaviour.fly();
}
}
public class SimpleDuck : Duck
{
public SimpleDuck(IFlybehaviour flybehaviour)
{
flybehaviour = new GeneralFlybehaviour();
}
}
In the main method
void main()
{
Duck d = new SimpleDuck();
d.PerformFly();
}
Это подчиняется как " Открытый закрытый принцип ", так и " Принцип замещения Лискова ", где я могу создать 50 различных типов уток, таких как SimpleDuck
, FlyingDuck
и т. Д.
Теперь мне нужен класс ComplicatedDuck
, где он обладает особой способностью исполнять желания своих учеников, скажем:
//public class ComplicatedDuck extends Duck (Java)
public class ComplicatedDuck : Duck
{
public ComplicatedDuck(IFlybehaviour flybehaviour)
{
flybehaviour = new GeneralFlybehaviour();
}
public void GrantWishes()
{
Console.WriteLine("Wish Granted")
}
}
С этим изменением мы знаем, что оно нарушает «принцип подстановки Лискова», когда этот подкласс не заменит его базовый класс полностью.
Предположим, если я добавлю еще одну функцию в "абстрактный класс Duck" , тогда все унаследованные члены по крайней мере должны предоставить реализацию, говорящую, что "я не даю особых желаний".
В этом сценарии, который является лучшим решением, добавление метода в классе ComplicatedDuck или расширение BaseClass
Примечание: та же концепция работает для Java, просто заменяя ":" на
ключевое слово "Implements".