Полное руководство по языку программирования С# 14 и платформе .NET 10 / Интерфейсы

Интерфейсы в обобщениях

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Интерфейсы как ограничения обобщений

Интерфейсы могут выступать в качестве ограничений обобщений. При этом если в качестве ограничения можно указаь только один класс, то интерфейсов можно указать несколько.

Допустим, у нас есть следующие интерфейсы и класс, который их реализует:


interface IMessage
{
    string Text { get; } // текст сообщения
}
interface IPrintable
{
    void Print();
}
class Message : IMessage, IPrintable
{
    public string Text { get; }
    public Message(string text) => Text = text;

    public void Print() => Console.WriteLine(Text);
}

Интерфейс IMessage представляет интерфейс сообщения и определяет свойство Text для хранения текста сообщения. Интерфейс IPrintable определяет метод Print для условной печати сообщения. И непосредственно класс сообщения - класс Message реализует эти интерфейсы.

Используем выше перечисленные интерфейсы в качестве ограничений обобщенного класса:


class Messenger<T> where T: IMessage, IPrintable
{
    public void Send(T message)
    {
        Console.WriteLine("Отправка сообщения:");
        message.Print();
    }
}

В данном случае класс условного мессенджера использует параметр T - тип, который который реализует сразу два интерфейса IMessage и IPrintable. Например, выше определен класс Message, который реализует оба интерфейса, поэтому мы можем данным типом типизировать объекты Messenger:


// создаем мессенджер
var telegram = new Messenger<Message>();
// создаем сообщение
var message = new Message("Hello World!");
// отправляем сообщение
telegram.Send(message);

Также параметр T может представлять интерфейс, который наследуется от обоих интерфейсов:


interface IPrintableMessage: IPrintable, IMessage { }
class PrintableMessage : IPrintableMessage
{
    public string Text { get; }
    public PrintableMessage(string text) => Text = text;
    public void Print() => Console.WriteLine(Text);
}

В этом случае объекты Messenger мы можем типизировать типом IPrintableMessage:


var telegram = new Messenger<IPrintableMessage>();
var message = new PrintableMessage("Hello World!");
telegram.Send(message);

Обобщенные интерфейсы

Как и классы, интерфейсы могут быть обобщенными:


interface IUser<T>
{
    T Id { get; }
}
class User<T> : IUser<T>
{
    public T Id { get; }
    public User(T id) => Id = id;
}

Интерфейс IUser типизирован параметром T, который при реализации интерфейса используется в классе User. В частности, переменная _id определена как T, что позволяет нам использовать для id различные типы.

Определим две реализации: одна в качестве параметра будет использовать тип int, а другая - тип string:


IUser<int> user1 = new User<int>(6789);
Console.WriteLine(user1.Id);    // 6789

IUser<string> user2 = new User<string>("12345");
Console.WriteLine(user2.Id);    // 12345

Также при реализации интерфейса мы можем явным образом указать, какой тип будет использоваться для параметра T:


class IntUser : IUser<int>
{
	public int Id { get; }
    public IntUser(int id) => Id = id;
}

Применение:


IUser<int> user1 = new IntUser(2345);
Console.WriteLine(user1.Id);    // 2345

IntUser user2 = new IntUser(9840);
Console.WriteLine(user2.Id);    // 9840

Проверь себя

📋 Тест по теме «Интерфейсы в обобщениях» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ IMessage
{
    string Text { get; } // текст сообщения
}
interface IPrintable
{
    void Print();
}
class Message : IMessage, IPrintable
{
    public string Text { get; }
    public Message(string text) => Text = text;

    public void Print() => Console.WriteLine(Text);
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Messenger<T> _____ T: IMessage, IPrintable
{
    public void Send(T message)
    {
        Console.WriteLine("Отправка сообщения:");
        message.Print();
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

// создаем мессенджер
var telegram = new _____<Message>();
// создаем сообщение
var message = new Message("Hello World!");
// отправляем сообщение
telegram.Send(message);
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

interface IPrintableMessage: IPrintable, _____ { }
class PrintableMessage : IPrintableMessage
{
    public string Text { get; }
    public PrintableMessage(string text) => Text = text;
    public void Print() => Console.WriteLine(Text);
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var telegram = new Messenger<IPrintableMessage>();
var _____ = new PrintableMessage("Hello World!");
telegram.Send(message);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

interface IMessage
{
    string _____ { _____; } // текст сообщения
}
interface IPrintable
{
    void Print();
}
class Message : IMessage, IPrintable
{
    public string Text { get; }
    public Message(string text) => Text = text;

    public void Print() => Console.WriteLine(Text);
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

class Messenger<T> where T: IMessage, IPrintable
{
    public void _____(T message)
    {
        _____.WriteLine("Отправка сообщения:");
        message.Print();
    }
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

{
    {
        message.Print();
}
class Messenger<T> where T: IMessage, IPrintable
    }
        Console.WriteLine("Отправка сообщения:");
    public void Send(T message)
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Интерфейсы в обобщениях»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Интерфейсы в обобщениях», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

interface IMessage
{
    string Text { get; } // текст сообщения
}
interface IPrintable
{
    void Print();
}
class Message : IMessage, IPrintable
{
    public string Text { get; }
    public Message(string text) => Text = text;

    public void Print() => Console.WriteLine(Text);
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Интерфейсы в обобщениях»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

class Messenger<T> where T: IMessage, IPrintable
{
    public void Send(T message)
    {
        Console.WriteLine("Отправка сообщения:");
        message.Print();
    }
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Интерфейсы в обобщениях»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Интерфейсы в обобщениях»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Интерфейсы в обобщениях». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.