Ранее мы изучили, что такое объекты и классы. Также, рассмотрели свойства, которыми объекты обладают. Кроме того, были затронуты действия, которые могут совершаться над объектами, называемые методами. Главной задачей объектно — ориентированного подхода является упрощение процесса разработки. Весь подход стоит на трех основных принципах: наследование, инкапсуляция и полиморфизм. Рассмотрим каждый из них и объектно ориентированное программирование в целом.
Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!
Наследование
Используя наследование, мы может определить ряд дочерних классов. Они же будут наследовать свойства и методы базового. Таким образом, мы расширяем функциональность базового класса.

Вернемся к ранее рассмотренному примеру кода. Был описан класс «Персонаж», который является базовым. От него могут быть унаследованы более «узкие» классы персонажей, такие как «Воин», «Стрелок», «Маг» и другие. Следует заметить, что класс может наследоваться только от одного базового класса.
/// <summary> /// Класс "Воин". /// </summary> public class Warrior : Character { } /// <summary> /// Класс "Маг". /// </summary> public class Wizard : Character { } /// <summary> /// Класс "Лучник". /// </summary> public class Archer : Character { }
Инкапсуляция
Этот принцип гласит о том, что внутреннее устройство объекта должно быть скрыто от пользователя. Так, пользователю предоставляется доступ только к определенному набору методов, которые необходимы для взаимодействия с объектом. Под пользователем в данном случае понимается наследник или разработчик. По сути своей объект должен быть абсолютно автономным и иметь определенный набор инструментов, позволяющих управлять им. К примеру, стрелок не обязан иметь доступ к внутреннему устройству оружия. Однако ему необходимы методы для ведения огня и перезарядки, а также пополнению боезапаса. И, соответственно, доступ к определенным частям оружия.
Полиморфизм
Достаточно сложное в определении понятие. Если говорить упрощенно, мы можем использовать свойства и методы потомков. К примеру, мы объявили несколько потомков класса «Персонаж».
Character warrior = new Warrior();
При подобной записи warrior будет являться объектом класса «Воин» несмотря на то, что типом мы указали базовый класс.
Наследование от Object
В C# любой класс является наследником класса Object. Благодаря этому свойству экземпляр любого класса обладает рядом полезных методов.
- Equals() — сравнение переданного в качестве параметра объекта с текущим.
- GetHashCode() — возвращает хеш-код текущего объекта в памяти.
- GetType() — позволяет идентифицировать тип объекта.
- ToString() — приводит класс к строке.
- Finalize() — отвечает за уничтожение объекта (вызывается автоматически).
- MemberwiseClone() — возвращает точную копию объекта.
Любой из этих методов может быть переопределен для изменения или дополнения функциональности.
Объектно ориентированное программирование — Итоги
Итак, это минимум, необходимый для понимания что такое объектно-ориентированное программирование. Переопределение методов мы рассмотрим далее. Удачных экспериментов, коллеги.
Также рекомендую изучить статью SOLID в объектно-ориентированном программировании. А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.