BasicKnowledgeCSharp/LessonsAndTasks/Lesson 76 - Абстрактные классы, abstract/Program.cs
Dvurechensky 058c8f2679 1.0
Main
2024-10-05 09:59:53 +03:00

108 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}