Определение: Механизм, позволяющий создавать новый класс на основе существующего, заимствуя его функциональность.
Пример из опыта: В платежной системе мы реализовывали иерархию типов платежей:
public abstract class PaymentBase
{
public decimal Amount { get; set; }
public abstract void Process();
}
public class CreditCardPayment : PaymentBase
{
public string CardNumber { get; set; }
public override void Process()
{
// Логика обработки кредитной карты
Console.WriteLine($"Processing credit card payment of {Amount}");
}
}
public class BankTransferPayment : PaymentBase
{
public string AccountNumber { get; set; }
public override void Process()
{
// Логика банковского перевода
Console.WriteLine($"Processing bank transfer of {Amount}");
}
}
Особенности в C#:
System.Object
(или просто object
)Определение: Принцип, объединяющий данные и методы работы с ними в единый компонент и защищающий внутреннее состояние от неконтролируемого доступа.
Пример из практики: В модуле управления температурой промышленного оборудования:
public class TemperatureController
{
private double _currentTemp;
private const double MaxTemp = 100.0;
public double CurrentTemperature
{
get => _currentTemp;
private set => _currentTemp = value > MaxTemp ? MaxTemp : value;
}
public void IncreaseTemp(double delta)
{
if (delta > 0 && delta <= 10)
CurrentTemperature += delta;
}
public void EmergencyCoolDown()
{
_currentTemp = 25.0; // Прямой доступ к полю в критическом методе
}
}
Почему важно: Предотвратили ситуации, когда:
Определение: Выделение основных характеристик объекта, игнорируя несущественные детали.
Пример из проекта: Абстракция системы логирования:
public interface ILogger
{
void Log(string message, LogLevel level);
}
public enum LogLevel { Info, Warning, Error }
// Реализация для облачного логирования
public class CloudLogger : ILogger
{
public void Log(string message, LogLevel level)
{
// Сложная логика подключения к облачному сервису
// Аутентификация, сериализация, retry-политики...
Console.WriteLine($"[CLOUD] {level}: {message}");
}
}
// Использование в сервисе
public class OrderService
{
private readonly ILogger _logger;
public OrderService(ILogger logger)
{
_logger = logger;
}
public void ProcessOrder(Order order)
{
_logger.Log("Processing order started", LogLevel.Info);
// Логика обработки заказа
}
}
Преимущество: Сервису заказов не нужно знать детали реализации логирования.
Определение: Возможность использования объектов с одинаковым интерфейсом без информации о конкретном типе объекта.
Пример из реального проекта: Система рендеринга элементов UI:
public abstract class UiElement
{
public Position Position { get; set; }
public abstract void Render();
}
public class Button : UiElement
{
public string Text { get; set; }
public override void Render()
{
Console.WriteLine($"Rendering button at {Position} with text '{Text}'");
}
}
public class TextBox : UiElement
{
public string Content { get; set; }
public override void Render()
{
Console.WriteLine($"Rendering text box at {Position} containing '{Content}'");
}
}
// Использование
public class UiRenderer
{
public void RenderElements(IEnumerable<UiElement> elements)
{
foreach (var element in elements)
{
element.Render(); // Полиморфный вызов
}
}
}
Особенность: Метод RenderElements
работает с абстракцией UiElement
, не зная о конкретных реализациях.
Базовый класс для всех типов в .NET:
Все классы неявно наследуются от System.Object
(псевдоним object
в C#). Даже если явно не указано, компилятор добавляет это автоматически.
Множественное наследование:
В C# не разрешено множественное наследование классов. Однако:
Пример с интерфейсами:
public interface ILoggable
{
void Log(string message);
}
public interface ISerializable
{
string Serialize();
}
public class MyEntity : ILoggable, ISerializable
{
public void Log(string message) => Console.WriteLine(message);
public string Serialize() => JsonConvert.SerializeObject(this);
}
Наследование - создание иерархий классов (: baseClass
)
object
Инкапсуляция - контроль доступа к состоянию (private
, свойства)
Абстракция - работа с концепциями (abstract
, интерфейсы)
Полиморфизм - единый интерфейс для разных реализаций (override
, virtual
)
Практическое применение этих принципов позволяет создавать: