6_Абстракци и пространства имён

Урок 6 : Абстракция и пространства имён

О чём этот урок

Абстрактные классы, интерфейсы и пространства имён - инструменты для создания гибкой архитектуры. Практика строится вокруг системы инвентаря.


Теория

Вопросы для самопроверки

  1. Что такое абстракция в контексте объектно-ориентированного программирования (ООП) и C#?
  2. Назовите два основных механизма реализации абстракции в C#. Чем они отличаются?
  3. В чём ключевые различия между абстрактным классом и интерфейсом?
  4. Чем модификатор virtual отличается от модификатора abstract?
  5. * Что такое полиморфизм и как он связан с абстракцией?
  6. Что такое пространство имён и какова его основная цель?
  7. Какие существуют способы обращения к объектам из другого пространства имён?
  8. * Что такое pattern matching? Как работают операторы is и is not? Чем полезен switch с when?


Практика

Как выполнять задания

Откройте файл Lesson6.cs для выполнения заданий. Результат выводить в строку консоли.
Все создаваемые классы должны находиться в отдельном пространстве имён.

Задания

Задание 1.

* Создайте три типа предметов: Weapon, Armor и Consumable. Они должны иметь общий метод Activate(), реализованный в родительском классе. При этом у Consumable он должен быть переопределён:

  • базовый Activate() просто выводит название предмета в консоль;
  • Consumable.Activate() выводит сообщение об использовании и возвращает true (указывая, что предмет одноразовый и должен быть удалён).
Задание 2.

* Создайте список предметов во внешнем классе Inventory и заполните его несколькими разными предметами. Реализуйте активацию предмета по введённому индексу. Список выводить в формате:

[индекс] : {название предмета} : {тип предмета}

Обновлять вывод после каждой активации.

Задание 3.

*** Создайте интерфейс IStorable со свойствами:

  • int StorageSize { get; } - сколько места занимает предмет;
  • bool CanBeStored { get; } - можно ли хранить этот предмет.
    Реализуйте интерфейс в классах предметов:
    | Класс | StorageSize | CanBeStored |
    |---|---|---|
    | Weapon | 5 | true |
    | Armor | 10 | true |
    | Consumable | 1 | true |
    В классе Inventory:
  • добавьте приватное поле List<Item> storage для хранилища;
  • реализуйте метод bool MoveToStorage(int index), который:
    • проверяет, что предмет по индексу существует и реализует IStorable;
    • проверяет, что в хранилище достаточно места (максимум 100 единиц);
    • перемещает предмет из основного инвентаря в хранилище;
    • возвращает true при успешном перемещении.
  • реализуйте метод bool MoveFromStorage(int index) для обратного перемещения.
Задание 4.

** Реализуйте управление инвентарём по следующей схеме:

  1. Выбор инвентаря: 1 - Основной, 2 - Хранилище
  2. Выбор действия:
    • Если Основной: 1 - Активировать предмет, 2 - Попытаться сложить в хранилище
    • Если Хранилище: 1 - Попытаться взять предмет
Подсказка

Реализуйте небольшой размер хранилища, чтобы не все предметы в него поместились - это покажет работу проверки вместимости.


📋 Вернуться к теории урока 6