我正在實施策略模式來實現不同類型鴨子的行為。這是代碼: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等等?,F在我需要一個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
提交
取消