我正在实施策略模式来实现不同类型鸭子的行为。这是代码:
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();
}
这符合“开放封闭原则”和“ Liskov 替代原则”,我可以在其中创建 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")
}
}
通过此更改,我们知道它违反了“Liskov 替换原则”,即该子类不会完全替换其基类。
假设如果我在“抽象类 Duck”中再添加一个函数,那么所有继承的成员至少需要提供一个实现,说明“我不授予特殊的愿望”。
在这种情况下,这是更好的解决方案,在 ComplicatedDuck 类中添加一个方法或扩展 BaseClass
注意:同样的概念适用于 Java 也只是用“implements”关键字替换“:”。
MM们
隔江千里
拉莫斯之舞
相关分类