Файл: Тема Основные шаблоны.ppt

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 46

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Допустим, есть система транспортных средств: легковой автомобиль, автобус, трамвай, поезд и т.д.
Поскольку данные объекты являются родственными, можно выделить у них общие признаки, то в данном случае можно использовать абстрактные классы:


Абстрактный класс Vehicle определяет абстрактный метод перемещения Move(), а классы-наследники его реализуют.
Предположим, что система транспорта не ограничивается вышеперечисленными транспортными средствами.
Например, можно добавить самолеты, лодки.
Можно также добавить лошадь - животное, которое может также выполнять роль транспортного средства, дирижабль.
Получается широкий круг объектов, которые связаны только тем, что являются транспортным средством и должны реализовать некоторый метод Move(), выполняющий перемещение.


Так как объекты малосвязанные между собой, то для определения общего для всех них функционала лучше определить интерфейс.
Тем более некоторые из этих объектов могут существовать в рамках параллельных систем классификаций.
Например, лошадь может быть классом в структуре системы классов животного мира.
Возможная реализация интерфейса могла бы выглядеть следующим образом:


Теперь метод Move() определяется в интерфейсе IMovable, а конкретные классы его реализуют.
Говоря об использовании абстрактных классов и интерфейсов можно привести еще такую аналогию, как состояние и действие.
Как правило, абстрактные классы фокусируются на общем состоянии классов-наследников.
В то время как интерфейсы строятся вокруг какого-либо общего действия.


Например, солнце, костер, батарея отопления и электрический нагреватель выполняют функцию нагревания или излучения тепла.
По большому счету выделение тепла - это единственный общий между ними признак.
Можно ли для них создать общий абстрактный класс?


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


Например, в одной системе классов, которые наследуются от общего астрактного класса, были бы звезды, в том числе и солнце, планеты, астероиды и так далее - то есть все те объекты, которые могут иметь какое-то общее с солнцем состояние.
В рамках другой системы классов мы могли бы определить электрические приборы, в том числе электронагреатель.



И так, для каждой разноплановой сущности можно было бы составить свою систему классов, исходяющую от определенного абстрактного класса.
А для общего действия определить интерфейс, например, IHeatable, в котором бы был метод Heat, и этот интерфейс реализовать во всех необходимых классах.


Таким образом, если разноплановые классы обладают каким-то общим действием, то это действие лучше выносить в интерфейс.
А для одноплановых классов, которые имеют общее состояние, лучше определять абстрактный класс.


https://metanit.com/sharp/patterns/1.1.php