ООП: инкапсуляция, наследование, полиморфизм
Три кита ООП с человеческими примерами, абстракция, отличие класса от объекта и как это формулировать на защите курсовой.
ООП — способ описывать программу как набор объектов, у каждого из которых есть состояние (поля) и поведение (методы). Класс — это чертёж, объект — конкретное изделие по этому чертежу.
Инкапсуляция
Данные прячутся внутри класса, наружу торчат только методы. Смысл не в секретности, а в контроле: нельзя записать в поле «возраст» число −5, если запись идёт через сеттер с проверкой.
class Student {
private int _age;
public int Age {
get => _age;
set {
if (value < 0 || value > 120) throw new ArgumentException("Некорректный возраст");
_age = value;
}
}
}
Наследование
Класс-наследник получает поля и методы родителя и добавляет своё. Правильный критерий — отношение «является»: Круг является Фигурой. Если отношение «состоит из» (Автомобиль состоит из Двигателя), нужно не наследование, а композиция.
Полиморфизм
Один и тот же вызов работает по-разному в зависимости от фактического типа объекта. Это то, ради чего вообще существует наследование.
abstract class Figure { public abstract double Area(); }
class Circle : Figure { public double R; public override double Area() => Math.PI * R * R; }
class Rect : Figure { public double A, B; public override double Area() => A * B; }
Figure[] figures = { new Circle { R = 2 }, new Rect { A = 3, B = 4 } };
foreach (var f in figures) Console.WriteLine(f.Area()); // каждый считает по-своему
Различают полиморфизм времени выполнения (виртуальные методы, переопределение) и времени компиляции (перегрузка методов, шаблоны/дженерики).
Абстракция — четвёртый принцип
Абстракция — выделение существенного и отбрасывание деталей. В коде это абстрактные классы и интерфейсы: они говорят, что объект умеет делать, не говоря, как именно.
Шпаргалка на защиту
| Принцип | Формулировка в одну строку | Где в моём коде |
|---|---|---|
| Инкапсуляция | Данные закрыты, доступ через методы с проверками | Приватные поля и свойства класса |
| Наследование | Общее поведение вынесено в базовый класс | Иерархия классов |
| Полиморфизм | Один интерфейс — разные реализации | Виртуальные/абстрактные методы |
| Абстракция | Работаем с интерфейсом, а не с деталями | Интерфейсы и абстрактные классы |
Частые вопросы
Чем абстрактный класс отличается от интерфейса?
Абстрактный класс может содержать реализацию и поля, наследоваться от него можно только от одного. Интерфейс задаёт только контракт, и реализовать их можно много.
Что такое SOLID и надо ли его знать?
Это пять принципов проектирования (единственная ответственность, открытость/закрытость, подстановка Лисков, разделение интерфейсов, инверсия зависимостей). На защите курсовой достаточно уметь показать первый и третий на своём коде.