public interface IDuckBehavior
public abstract class Duck
public Duck(double weight, int numWings, DuckType type)
this.numWings = numWings;
public abstract void ShowDetails();
public override string ToString()
return "Weight: " + weight + " kg\nNumber of wings: " + numWings + "\nType: " + type;
public class RubberDuck : Duck, IDuckBehavior
public RubberDuck(double weight, int numWings) : base(weight, numWings, DuckType.Rubber)
public override void ShowDetails()
Console.WriteLine("Rubber Duck");
Console.WriteLine(ToString());
Console.WriteLine("Rubber ducks don't fly.");
Console.WriteLine("Squeak!");
public class MallardDuck : Duck, IDuckBehavior
public MallardDuck(double weight, int numWings) : base(weight, numWings, DuckType.Mallard)
public override void ShowDetails()
Console.WriteLine("Mallard Duck");
Console.WriteLine(ToString());
Console.WriteLine("Mallard ducks fly fast.");
Console.WriteLine("Quack! Quack! Quack!");
public class RedheadDuck : Duck, IDuckBehavior
public RedheadDuck(double weight, int numWings) : base(weight, numWings, DuckType.Redhead)
public override void ShowDetails()
Console.WriteLine("Redhead Duck");
Console.WriteLine(ToString());
Console.WriteLine("Redhead ducks fly slow.");
Console.WriteLine("Quack.");
public static void Main(string[] args)
Duck rubberDuck = new RubberDuck(0.1, 0);
Duck mallardDuck = new MallardDuck(1.5, 2);
Duck redheadDuck = new RedheadDuck(1.2, 2);
rubberDuck.ShowDetails();
mallardDuck.ShowDetails();
redheadDuck.ShowDetails();
IDuckBehavior[] ducks = { rubberDuck as IDuckBehavior, mallardDuck as IDuckBehavior, redheadDuck as IDuckBehavior };
foreach (var duck in ducks)