Ответ
Нет, интерфейсы в C# не могут содержать поля экземпляра (instance fields). Они определяют контракт — набор членов, которые реализующий класс должен предоставить, а поля относятся к внутренней реализации.
Что может содержать интерфейс:
- Методы (включая методы расширения)
- Свойства (автореализуемые или с явными get/set-аксессорами)
- События (
event) - Индексаторы (
this[])
Пример допустимого содержимого интерфейса:
public interface ILoggable
{
// Свойство — это допустимо (по сути, методы get/set).
string Id { get; }
// Метод — это допустимо.
void Log(string message);
// Событие — это допустимо.
event EventHandler OnLogged;
// Статическое поле/константа — допустимо (начиная с C# 8.0).
static readonly string DefaultCategory = "General";
const int MaxEntries = 1000;
}
Почему поля недопустимы? Поле — это данные. Разрешение полей в интерфейсе означало бы навязывание конкретной реализации хранения данных, что нарушает принцип абстракции. Если вам нужно обязать реализующий класс иметь определенное поле, используйте абстрактный класс.
// Абстрактный класс МОЖЕТ содержать поля.
abstract class AbstractExample
{
protected int _value; // Поле — допустимо.
}
Важно: Начиная с C# 8.0, интерфейсы поддерживают статические члены, включая статические поля и методы, но это по-прежнему не поля экземпляра.