static void Main(string[] args) { List <DuckBase> ducks = new List <DuckBase>(); ducks.Add(new ExoticDuck()); ducks.Add(new SimpleDuck()); ducks.Add(new WoodenDuck()); ducks.Add(new RubberDuck()); foreach (var duck in ducks) { duck.Display(); duck.Swim(); duck.Quack(); duck.Fly(); Console.WriteLine(); } DuckBase upgradableDuck = new UpgradableDuck(); upgradableDuck.Display(); upgradableDuck.Swim(); upgradableDuck.Quack(); upgradableDuck.Fly(); upgradableDuck.SetFlyBehaviour(new FlyWithWings()); upgradableDuck.SetQuackBehaviour(new ExoticQuack()); upgradableDuck.Quack(); upgradableDuck.Fly(); Console.ReadLine(); }
static void Main(string[] args) { List <DuckBase> ducks = new List <DuckBase> // список универсального типа, в данном случае содержит { // объекты класса DuckBase new ExoticDuck(), new SimpleDuck(), new WoodenDuck(), new RubberDuck() }; foreach (var duck in ducks) // вызов всех методов каждого объекта { duck.Display(); duck.Swim(); duck.Quack(); duck.Fly(); Console.WriteLine(); } DuckBase upgradableDuck = new UpgradableDuck(); // динамический объект, поддерживающий изменения upgradableDuck.Display(); upgradableDuck.Swim(); upgradableDuck.Quack(); upgradableDuck.Fly(); upgradableDuck.SetFlyBehaviour(new FlyWithWings()); // пример переопределения непостоянных методов upgradableDuck.SetQuackBehaviour(new ExoticQuack()); // (переприсваивается нужная реализация интерфейса) upgradableDuck.Quack(); // повторный вызов изменённых методов upgradableDuck.Fly(); Console.ReadKey(); // задержка ввода }
static void Main() { var ducks = new List <DuckBase> { new SimpleDuck(), new ExoticDuck(), new WoodenDuck(), new RubberDuck() }; foreach (var duck in ducks) { duck.Display(); duck.Swim(); duck.Quack(); duck.Fly(); Console.WriteLine(); } var upgradableDuck = new UpgradableDuck(); upgradableDuck.Display(); upgradableDuck.Swim(); upgradableDuck.flyBehaviour = new FlyWithWings(); upgradableDuck.quackBehaviour = new ExoticQuack(); upgradableDuck.Quack(); upgradableDuck.Fly(); }