Какие основные принципы ООП?

«Какие основные принципы ООП?» — вопрос из категории ООП, который задают на 47% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Объектно-ориентированное программирование (ООП) базируется на четырёх основных принципах, которые помогают создавать гибкий, поддерживаемый и переиспользуемый код.

  1. Инкапсуляция — сокрытие внутреннего состояния объекта и деталей реализации. Доступ к данным осуществляется только через публичный интерфейс (методы, свойства). Это защищает целостность данных и позволяет изменять реализацию, не ломая клиентский код.

    public class BankAccount
    {
        private decimal _balance; // Поле скрыто (инкапсулировано)
    
        public decimal Balance { get { return _balance; } } // Только чтение
    
        public void Deposit(decimal amount)
        {
            if (amount > 0) _balance += amount; // Валидация внутри класса
        }
    }
  2. Наследование — механизм, позволяющий создавать новый класс (производный) на основе существующего (базового), заимствуя его поля и методы. В C# поддерживается одиночное наследование классов.

    public class Vehicle // Базовый класс
    {
        public string Make { get; set; }
        public void StartEngine() { Console.WriteLine("Engine started."); }
    }
    
    public class Car : Vehicle // Производный класс
    {
        public int NumberOfDoors { get; set; }
    }
    // Car автоматически получает свойства Make и метод StartEngine.
  3. Полиморфизм — способность объектов с одинаковой спецификацией (например, один базовый класс) иметь различную реализацию. Позволяет работать с объектами производных классов через интерфейс базового класса.

    public abstract class Shape
    {
        public abstract double GetArea(); // Абстрактный метод
    }
    
    public class Circle : Shape
    {
        public double Radius { get; set; }
        public override double GetArea() => Math.PI * Radius * Radius;
    }
    
    public class Square : Shape
    {
        public double Side { get; set; }
        public override double GetArea() => Side * Side;
    }
    
    // Полиморфное поведение:
    List<Shape> shapes = new List<Shape> { new Circle { Radius = 5 }, new Square { Side = 4 } };
    foreach (var shape in shapes)
    {
        Console.WriteLine(shape.GetArea()); // Вызовется правильная реализация для каждого типа
    }
  4. Абстракция — выделение существенных характеристик объекта и игнорирование несущественных деталей. Реализуется через абстрактные классы и интерфейсы, которые определяют что должен делать объект, но не как.

    // Абстракция через интерфейс
    public interface ILogger
    {
        void Log(string message); // Контракт: любой логгер должен уметь логировать
    }
    
    public class FileLogger : ILogger { public void Log(string message) { /* запись в файл */ } }
    public class ConsoleLogger : ILogger { public void Log(string message) { Console.WriteLine(message); } }

Эти принципы являются фундаментом для более продвинутых принципов проектирования, таких как SOLID.

Видео-ответы