Setting behaviour dynamically

This commit is contained in:
2025-10-30 15:24:03 +01:00
parent 695fb26ce4
commit e5a041da0d
3 changed files with 22 additions and 3 deletions

View File

@@ -1,14 +1,16 @@
namespace Ch1Duck; namespace Ch1Duck;
public abstract class Duck(IFlyBehaviour flyBehaviour, IQuackBehaviour quackBehaviour) { public abstract class Duck(IFlyBehaviour flyBehaviour, IQuackBehaviour quackBehaviour) {
internal IFlyBehaviour FlyBehaviour { get; set; } = flyBehaviour;
internal IQuackBehaviour QuackBehaviour { get; set; } = quackBehaviour;
public abstract void Display(); public abstract void Display();
public void PerformFly() { public void PerformFly() {
flyBehaviour.Fly(); FlyBehaviour.Fly();
} }
public void PerformQuack() { public void PerformQuack() {
quackBehaviour.Quack(); QuackBehaviour.Quack();
} }
} }
@@ -16,4 +18,10 @@ public class MallardDuck() : Duck(new FlyWithWings(), new NormalQuack()) {
public override void Display() { public override void Display() {
Console.WriteLine("I'm a real Mallard duck"); Console.WriteLine("I'm a real Mallard duck");
} }
}
public class ModelDuck() : Duck(new FlyNoWay(), new NormalQuack()) {
public override void Display() {
Console.WriteLine("I'm a model duck");
}
} }

View File

@@ -14,4 +14,10 @@ public class FlyNoWay: IFlyBehaviour {
public void Fly() { public void Fly() {
Console.WriteLine("I can't fly"); Console.WriteLine("I can't fly");
} }
}
public class FlyRocketPowered: IFlyBehaviour {
public void Fly() {
Console.WriteLine("I'm flying with a rocket!");
}
} }

View File

@@ -4,4 +4,9 @@ using Ch1Duck;
Duck mallard = new MallardDuck(); Duck mallard = new MallardDuck();
mallard.PerformQuack(); mallard.PerformQuack();
mallard.PerformFly(); mallard.PerformFly();
Duck model = new ModelDuck();
model.PerformFly();
model.FlyBehaviour = new FlyRocketPowered();
model.PerformFly();