Что такое класс в объектно-ориентированном программировании (ООП)?

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

Ответ

Класс — это базовый строительный блок ООП, выступающий в роли шаблона (blueprint) для создания объектов. Он инкапсулирует:

  • Данные (состояние): в виде полей и свойств.
  • Поведение (операции): в виде методов.

Пример моделирования сущности "Счет в банке" на C#:

public class BankAccount
{
    // Поле (private - состояние инкапсулировано)
    private decimal _balance;
    private readonly string _accountNumber;

    // Конструктор для инициализации объекта
    public BankAccount(string accountNumber, decimal initialBalance)
    {
        _accountNumber = accountNumber;
        _balance = initialBalance >= 0 ? initialBalance : 0;
    }

    // Свойства для контролируемого доступа к данным (инкапсуляция)
    public string AccountNumber => _accountNumber; // Только для чтения
    public decimal Balance => _balance; // Только для чтения

    // Методы, определяющие поведение
    public void Deposit(decimal amount)
    {
        if (amount > 0)
        {
            _balance += amount;
            LogTransaction($"Внесено: {amount}");
        }
    }

    public bool Withdraw(decimal amount)
    {
        if (amount > 0 && _balance >= amount)
        {
            _balance -= amount;
            LogTransaction($"Снято: {amount}");
            return true;
        }
        return false;
    }

    // Приватный вспомогательный метод (деталь реализации скрыта)
    private void LogTransaction(string message)
    {
        Console.WriteLine($"Счет {_accountNumber}: {message}. Баланс: {_balance}");
    }
}

// Использование класса
var account = new BankAccount("ACC123", 1000); // Создание объекта (экземпляра)
account.Deposit(500);
bool success = account.Withdraw(200); // success = true
Console.WriteLine(account.Balance); // 1300

Связь с принципами ООП:

  1. Инкапсуляция: Поле _balance приватное, изменение состояния возможно только через публичные методы Deposit/Withdraw, которые обеспечивают валидацию.
  2. Абстракция: Пользователь класса видит только публичный интерфейс (методы), скрыта внутренняя логика (например, LogTransaction).
  3. Наследование (можно расширить): class SavingsAccount : BankAccount { ... }.
  4. Полиморфизм: Объекты производных классов могут использоваться вместо объектов базового класса.