2025-05-12 02:48:54 +03:00
|
|
|
|
/*
|
|
|
|
|
* Author: Nikolay Dvurechensky
|
|
|
|
|
* Site: https://www.dvurechensky.pro/
|
|
|
|
|
* Gmail: dvurechenskysoft@gmail.com
|
|
|
|
|
* Last Updated: 12 мая 2025 02:47:11
|
|
|
|
|
* Version: 1.0.3
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
using System;
|
2024-10-05 09:59:53 +03:00
|
|
|
|
/*
|
|
|
|
|
* полиморфизм
|
|
|
|
|
*
|
|
|
|
|
* абстрактный класс
|
|
|
|
|
*
|
|
|
|
|
* абстрактный метод
|
|
|
|
|
*
|
|
|
|
|
* абстрактное свойство
|
|
|
|
|
*/
|
|
|
|
|
/// <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();
|
|
|
|
|
}
|
|
|
|
|
}
|