Как реализовать наследование в данной задаче?

Условие задачи:
Классификация бойцов:
Soldier –– стреляет из пистолета (Shoot from gun)
CoolerSoldier –– стреляет из пистолета и кидает гранату (Shoot from gun and throw a grenade)
ManInBlack –– стреляет из бластера (Shoot from blaster)
ManInBlackBoss –– стреляет из бластера и призывает армию инопланетян (Shoot from blaster and call an army of aliens)

Формат ввода
На вход подается одна строка, состоящая из двух слов: обращения к военному и реального звания военного.

Формат вывода
На выход подается строка –– действие военного. Если к военному обратились как к солдату (тип ссылки Soldier), то только CoolerSoldier должен вывести "Shoot from gun and throw a grenade", все остальные же должны вывести "Shoot from gun".
Если к бойцу обратились как к человеку в черном (тип ссылки ManInBlack), то ManInBlack должен вывести "Shoot from blaster", а ManInBlackBoss должен вывести "Shoot from blaster and call an army of aliens".

Примеры:
Soldier CoolerSoldier => Shoot from gun and throw a grenade
Soldier Soldier => Shoot from gun
Soldier ManInBlack => Shoot from gun
Soldier ManInBlackBoss => Shoot from gun

ManInBlack ManInBlack => Shoot from blaster
ManInBlack ManInBlackBoss => Shoot from blaster and call an army of aliens

Обращаю внимание на то, что изменять файл Program.cs запрещено!

Program.cs:
using System;

internal class Program
{
    private static void Main(string[] args)
    {
        string[] info = Console.ReadLine().Split();
        switch (info[0])
        {
            case "Soldier":
                var soldier = info[1] switch
                {
                    "Soldier" => new Soldier(),
                    "CoolerSoldier" => new CoolerSoldier(),
                    "ManInBlack" => new ManInBlack(),
                    "ManInBlackBoss" => new ManInBlackBoss(),
                    _ => throw new NotImplementedException()
                };
                Console.WriteLine(soldier.Attack());
                break;
            case "ManInBlack":
                var manInBlack = info[1] switch
                {
                    "ManInBlack" => new ManInBlack(),
                    "ManInBlackBoss" => new ManInBlackBoss(),
                    _ => throw new NotImplementedException()
                };
                Console.WriteLine(manInBlack.Attack());
                break;
        }
    }
}


Army.cs (что я попробовал сделать):
internal class Soldier
{
    public string Weapon { get; set; } = "gun";

    public virtual string Attack() => "Shoot from " + Weapon;
}

internal sealed class CoolerSoldier : Soldier
{
    public override string Attack() 
        => base.Attack() + " and throw a grenade";
}

internal class ManInBlack : Soldier
{
    public override string Attack() => base.Attack();
}

internal sealed class ManInBlackBoss : ManInBlack
{
    internal ManInBlackBoss() => Weapon = "blaster";

    public override string Attack() 
        => base.Attack() + " and call an army of aliens";
}
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 1
@NSpartak
Можно так:
internal class Soldier
{
    public virtual string Attack() => "Shoot from gun";
}

internal class CoolerSoldier : Soldier
{
    public override string Attack() => base.Attack() + " and throw a grenade";
}

internal class ManInBlack : Soldier
{
    public new virtual string Attack() => "Shoot from blaster";
}

internal class ManInBlackBoss : ManInBlack
{
    public override string Attack() => base.Attack() + " and call an army of aliens";
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы