108 lines
3.2 KiB
C#
108 lines
3.2 KiB
C#
using System;
|
||
/*
|
||
* полиморфизм
|
||
*
|
||
* абстрактный класс
|
||
*
|
||
* абстрактный метод
|
||
*
|
||
* абстрактное свойство
|
||
*/
|
||
/// <summary>
|
||
/// Абстрактный класс - это некая идея, которая может содержать в себе частичную реализацию
|
||
/// и содержание которого можно использовать в наследниках
|
||
///
|
||
/// Из урока 77 делаем интерфейс ShowInfo
|
||
/// </summary>
|
||
interface IHasInfo
|
||
{
|
||
void ShowInfo();
|
||
}
|
||
|
||
interface IWeapon
|
||
{
|
||
int Damage { get; }
|
||
void Fire();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Cмысл абстрактного класса в том, что поведение одно единое для всех реализует интерфейс
|
||
/// а отдельные отличия поведения разного рода объектов реализует абстрактный класс
|
||
///
|
||
/// Хотим научить наш класс Player стрелять из любого вида оружия
|
||
/// </summary>
|
||
abstract class Weapon : IHasInfo, IWeapon
|
||
{
|
||
public abstract int Damage { get; }
|
||
/// <summary>
|
||
/// Поведение
|
||
/// </summary>
|
||
public abstract void Fire();
|
||
/// <summary>
|
||
/// Не только абстрактный метод но и реализация возможна
|
||
/// </summary>
|
||
public void ShowInfo() => Console.WriteLine($"{GetType().Name}: {Damage}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// При наследовании от абстрактного класса - мы обязаны реализовать все его абстрактные методы
|
||
/// </summary>
|
||
class Gun : Weapon
|
||
{
|
||
public override int Damage { get { return 5; } }
|
||
|
||
public override void Fire()
|
||
=> Console.WriteLine("Boom");
|
||
}
|
||
|
||
/// <summary>
|
||
/// При наследовании от абстрактного класса - мы обязаны реализовать все его абстрактные методы
|
||
/// </summary>
|
||
class LazerGun : Weapon
|
||
{
|
||
public override int Damage => 9;
|
||
|
||
public override void Fire()
|
||
=> Console.WriteLine("Boom's");
|
||
}
|
||
|
||
/// <summary>
|
||
/// При наследовании от абстрактного класса - мы обязаны реализовать все его абстрактные методы
|
||
/// </summary>
|
||
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();
|
||
}
|
||
} |