using System; /* * полиморфизм * * абстрактный класс * * абстрактный метод * * абстрактное свойство */ /// /// Абстрактный класс - это некая идея, которая может содержать в себе частичную реализацию /// и содержание которого можно использовать в наследниках /// /// Из урока 77 делаем интерфейс ShowInfo /// interface IHasInfo { void ShowInfo(); } interface IWeapon { int Damage { get; } void Fire(); } /// /// Cмысл абстрактного класса в том, что поведение одно единое для всех реализует интерфейс /// а отдельные отличия поведения разного рода объектов реализует абстрактный класс /// /// Хотим научить наш класс Player стрелять из любого вида оружия /// abstract class Weapon : IHasInfo, IWeapon { public abstract int Damage { get; } /// /// Поведение /// public abstract void Fire(); /// /// Не только абстрактный метод но и реализация возможна /// public void ShowInfo() => Console.WriteLine($"{GetType().Name}: {Damage}"); } /// /// При наследовании от абстрактного класса - мы обязаны реализовать все его абстрактные методы /// class Gun : Weapon { public override int Damage { get { return 5; } } public override void Fire() => Console.WriteLine("Boom"); } /// /// При наследовании от абстрактного класса - мы обязаны реализовать все его абстрактные методы /// class LazerGun : Weapon { public override int Damage => 9; public override void Fire() => Console.WriteLine("Boom's"); } /// /// При наследовании от абстрактного класса - мы обязаны реализовать все его абстрактные методы /// class Bow : Weapon { public override int Damage => 12; public override void Fire() => Console.WriteLine("Bzzzzzzzz"); } class Box : IHasInfo { public void ShowInfo() => Console.WriteLine("Я ЯЩИК!"); } class Player { public void Fire(IWeapon weapon) => weapon.Fire(); public void CheckInfo(Weapon weapon) => weapon.ShowInfo(); public void CheckInterfaceInfo(IHasInfo hasInfo) => hasInfo.ShowInfo(); } class Program { static void Main() { var player = new Player(); Weapon[] inventory = { new Gun(), new LazerGun(), new Bow() }; foreach (var item in inventory) { player.CheckInfo(item); player.CheckInterfaceInfo(item); player.Fire(item); Console.WriteLine(); } player.CheckInterfaceInfo(new Box()); Console.ReadKey(); } }