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

Наследование интерфейсов

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

Интерфейсы, как и классы, могут наследоваться:


interface IAction
{
	void Move();
}
interface IRunAction : IAction
{
	void Run();
}
class BaseAction : IRunAction
{
	public void Move()
	{
		Console.WriteLine("Move");
	}
	public void Run()
	{
		Console.WriteLine("Run");
	}
}

При применении этого интерфейса класс BaseAction должен будет реализовать как методы и свойства интерфейса IRunAction, так и методы и свойства базового интерфейса IAction, если эти методы и свойства не имеют реализации по умолчанию.

Однако в отличие от классов мы не можем применять к интерфейсам модификатор sealed, чтобы запретить наследование интерфейсов.

Также мы не можем применять к интерфейсам модификатор abstract, поскольку интерфейс фактически итак, как правило, предоставляет абстрактный функционал, который должен быть реализован в классе или структуре (за исключением методов и свойств с реализацией по умолчанию).

Однако методы интерфейсов могут использовать ключевое слово new для скрытия методов из базового интерфейса:


IAction action1 = new RunAction();
action1.Move(); // I am moving

IRunAction action2 = new RunAction();
action2.Move(); // I am running

interface IAction
{
    void Move() => Console.WriteLine("I am moving");
}
interface IRunAction : IAction
{
    // скрываем реализацию из IAction
    new void Move() => Console.WriteLine("I am running");
}
class RunAction : IRunAction { }

Здесь метод Move из IRunAction скрывает метод Move из базового интерфейса IAction. Это имеет смысл, если в базовом интерфейсе определена реализация по умолчанию, как в случае выше, которую нужно переопределить. И в случае выше, если переменная представляет тип IRunAction, то для метода Move вызывается реализация этого интерфейса:


IRunAction action2 = new RunAction();
action2.Move(); // I am running

Иначе если переменная представляет тип IAction, то для метода Move применяется реализация этого интерфейса:


IAction action1 = new RunAction();
action1.Move(); // I am moving

Но класс RunAction может переопределить метод Move сразу для обоих интерфейсов.


IAction action1 = new RunAction();
action1.Move(); // I am tired

IRunAction action2 = new RunAction();
action2.Move(); // I am tired

interface IAction
{
    void Move() => Console.WriteLine("I am moving");
}
interface IRunAction : IAction
{
    new void Move() => Console.WriteLine("I am running");
}
class RunAction : IRunAction
{
    public void Move() => Console.WriteLine("I am tired");
}

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


public interface IAction
{
	void Move();
}
internal interface IRunAction : IAction
{
	void Run();
}

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


internal interface IAction
{
	void Move();
}
public interface IRunAction : IAction	// ошибка IRunAction может быть только internal
{
	void Run();
}

Проверь себя

📋 Тест по теме «Наследование интерфейсов» Тест по теме

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

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

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

_____ IAction
{
	void Move();
}
interface IRunAction : IAction
{
	void Run();
}
class BaseAction : IRunAction
{
	public void Move()
	{
		Console.WriteLine("Move");
	}
	public void Run()
	{
		Console.WriteLine("Run");
	}
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

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

IAction _____ = new RunAction();
action1.Move(); // I am moving

IRunAction action2 = new RunAction();
action2.Move(); // I am running

interface IAction
{
    void Move() => Console.WriteLine("I am moving");
}
interface IRunAction : IAction
{
    // скрываем реализацию из IAction
    new void Move() => Console.WriteLine("I am running");
}
class RunAction : IRunAction { }
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

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

IRunAction action2 = _____ RunAction();
action2.Move(); // I am running
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

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

IAction action1 = new _____();
action1.Move(); // I am moving
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

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

IAction _____ = new RunAction();
action1.Move(); // I am tired

IRunAction action2 = new RunAction();
action2.Move(); // I am tired

interface IAction
{
    void Move() => Console.WriteLine("I am moving");
}
interface IRunAction : IAction
{
    new void Move() => Console.WriteLine("I am running");
}
class RunAction : IRunAction
{
    public void Move() => Console.WriteLine("I am tired");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

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

_____ IAction
{
	void Move();
}
interface IRunAction : IAction
{
	void Run();
}
class BaseAction : IRunAction
{
	public void Move()
	{
		_____.WriteLine("Move");
	}
	public void Run()
	{
		Console.WriteLine("Run");
	}
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

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

_____ action1 = new RunAction();
action1.Move(); // I am moving

IRunAction action2 = new RunAction();
action2.Move(); // I am running

interface _____
{
    void Move() => Console.WriteLine("I am moving");
}
interface IRunAction : IAction
{
    // скрываем реализацию из IAction
    new void Move() => Console.WriteLine("I am running");
}
class RunAction : IRunAction { }
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

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

public interface IAction
internal interface IRunAction : IAction
	void Move();
{
}
}
	void Run();
{
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Наследование интерфейсов»
+30 XP

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

interface IAction
{
	void Move();
}
interface IRunAction : IAction
{
	void Run();
}
class BaseAction : IRunAction
{
	public void Move()
	{
		Console.WriteLine("Move");
	}
	public void Run()
	{
		Console.WriteLine("Run");
	}
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Наследование интерфейсов»
+30 XP

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

IAction action1 = new RunAction();
action1.Move(); // I am moving

IRunAction action2 = new RunAction();
action2.Move(); // I am running

interface IAction
{
    void Move() => Console.WriteLine("I am moving");
}
interface IRunAction : IAction
{
    // скрываем реализацию из IAction
    new void Move() => Console.WriteLine("I am running");
}
class RunAction : IRunAction { }
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Наследование интерфейсов»
+50 XP

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

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

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

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

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

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