我正在实施策略模式来实现不同类型鸭子的行为。这是代码: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 methodvoid 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”关键字替换“:”。
3 回答
隔江千里
TA贡献1906条经验 获得超10个赞
策略模式是关于具有不同的实现,IFlyBehavior
而不是关于继承Duck
.
您的代码的一个问题是您的Duck
基类中有一个从未使用过的私有字段。它只能被 Duck 使用,因此所有继承类型都无法访问它。如果你PerformFly()
会得到一个 NullReferenceException - 总是。如果你想继承Duck
可能想在 Duck 的构造函数中采用 IFlyBehavior。
还
flybehaviour = new GeneralFlybehaviour();
有点违背了拥有策略模式的目的,因为它会强制对其进行特定的实现。我想如果你想使用特定的IFlyBehavior
实现,而不是从 Duck 继承,你会使用组合
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
我认为您只是错过了从 Duck 类继承 ComplicatedDuck。它必须像 - ComplicatedDuck : Duck
您可以将现有方法 - public void GrantWishes() 移动到抽象类 Duck。
使用空定义使其成为虚拟。
在 ComplicatedDuck 类中,根据需要覆盖行为。
在 SimpleDuck 类中什么都不做。
这样就不会违反替代原则。
添加回答
举报
0/150
提交
取消