Ответ
Интерфейс — это контракт, который определяет что должен уметь делать класс (или структура), но не определяет как это делать. Он содержит только сигнатуры методов, свойств, событий и индексаторов.
Ключевые принципы и преимущества:
- Абстракция и контракт: Интерфейс скрывает детали реализации, оставляя только публичный API.
- Полиморфизм: Код может работать с объектом через интерфейс, не зная его конкретного типа.
- Слабая связанность: Компоненты зависят от абстракций (интерфейсов), а не от конкретных реализаций, что упрощает тестирование и замену.
- Множественное "наследование": Класс может реализовать несколько интерфейсов.
Пример на C#:
// Контракт для возможности сохранения данных
public interface IDataSaver
{
void Save(string data);
string Load();
}
// Конкретная реализация для файловой системы
public class FileDataSaver : IDataSaver
{
private string _filePath;
public FileDataSaver(string filePath) => _filePath = filePath;
public void Save(string data) => File.WriteAllText(_filePath, data);
public string Load() => File.Exists(_filePath) ? File.ReadAllText(_filePath) : null;
}
// Конкретная реализация для базы данных (условно)
public class DatabaseDataSaver : IDataSaver
{
public void Save(string data) { /* SQL-запрос на INSERT/UPDATE */ }
public string Load() { /* SQL-запрос на SELECT */ return "data from db"; }
}
// Клиентский код зависит только от интерфейса
public class DataProcessor
{
private readonly IDataSaver _saver;
// Внедрение зависимости через интерфейс
public DataProcessor(IDataSaver saver) => _saver = saver;
public void Process()
{
// Работает с любой реализацией IDataSaver
_saver.Save("processed result");
var loaded = _saver.Load();
}
}
Современное использование: Интерфейсы — основа Dependency Injection, модульного тестирования (мокирование) и архитектурных паттернов (Repository, Strategy).