Множественные интерфейсы
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy. Урок 27 из 70.
Хотя class может наследоваться только от одного base, он может реализовывать столько interfaces, сколько needed. Это одно из ключевых преимуществ interfaces перед абстрактными классами — они позволяют class принимать несколько вариантов поведения.
Чтобы реализовать несколько интерфейсов, просто перечислите их после двоеточия, разделив запятыми:
public interface IFlyable
{
void Fly();
}
public interface ISwimmable
{
void Swim();
}
public class Duck : IFlyable, ISwimmable
{
public void Fly()
{
Console.WriteLine("Flying through the air");
}
public void Swim()
{
Console.WriteLine("Swimming in the pond");
}
}Класс Duck должен реализовать все члены из обоих интерфейсов. Это естественным образом моделирует реальные сценарии — утка действительно умеет и летать, и плавать, поэтому логично, чтобы она выполняла оба контракта.
При объединении наследования с несколькими interfaces сначала должен идти base class:
public class Duck : Bird, IFlyable, ISwimmable
{
// Наследует от Bird, реализует оба интерфейса
}Эта гибкость позволяет тебе составлять поведение из нескольких источников. Robot может реализовывать IMovable, IChargeable и ISpeakable. Каждый интерфейс представляет одну возможность, и твой класс может комбинировать именно то, что ему нужно.
Задание
ЛегкоДавайте создадим систему устройств для умного дома, которая демонстрирует, как один класс может реализовывать несколько интерфейсов и получать разные возможности. Вы создадите устройства, которыми можно управлять и которые обладают функциями управления питанием.
Вы организуете код в четырех файлах:
IControllable.cs: Определите интерфейс с именемIControllableв пространстве именSmartHome. Этот интерфейс представляет устройства, которые можно включать и выключать. Он должен объявлять два метода:TurnOn()иTurnOff(), оба возвращают строку.INetworkConnected.cs: Определите интерфейс с именемINetworkConnectedв пространстве именSmartHome. Этот интерфейс представляет устройства, которые могут подключаться к сети. Он должен объявлять методConnect(string network), возвращающий строку.SmartTV.cs: Определите классSmartTVв пространстве именSmartHome, который реализует оба интерфейса:IControllableиINetworkConnected. У телевизора должны быть свойствоBrand(string) и свойствоScreenSize(int, представляющее размер в дюймах). Создайте конструктор, принимающий оба значения. Реализуйте все методы интерфейсов:TurnOn()возвращает"{Brand} {ScreenSize}-inch TV is now ON"TurnOff()возвращает"{Brand} {ScreenSize}-inch TV is now OFF"Connect(string network)возвращает"{Brand} TV connected to {network}"
Program.cs: В основном файле создайтеSmartTV, используя входные значения. Продемонстрируйте гибкость нескольких интерфейсов, сохранив один и тот же объект телевизора в переменных трех разных типов: конкретного типаSmartTV, переменнойIControllableи переменнойINetworkConnected. Вызовите соответствующие методы через каждую ссылку, чтобы показать, как с одним и тем же объектом можно работать по-разному в зависимости от того, с каким интерфейсом вы работаете.
Вы получите три входных значения:
- Название бренда телевизора
- Размер экрана в дюймах
- Название сети для подключения
Выведите результат в следующем формате:
Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}Например, если входные значения — Samsung, 55 и HomeWiFi, результат должен быть следующим:
Via SmartTV:
Samsung 55-inch TV is now ON
Samsung TV connected to HomeWiFi
Via IControllable:
Samsung 55-inch TV is now OFF
Via INetworkConnected:
Samsung TV connected to HomeWiFiОбратите внимание, как к одному и тому же объекту SmartTV можно обращаться через ссылки на разные интерфейсы. Когда объект сохранен как IControllable, можно вызывать только методы управления. Когда объект сохранен как INetworkConnected, можно вызывать только сетевые методы. В этом и заключается сила реализации нескольких интерфейсов: один класс получает несколько возможностей, сохраняя гибкость способов его использования!
Попробуйте сами
using System;
using SmartHome;
class Program
{
public static void Main(string[] args)
{
// Читать входные данные
string brand = Console.ReadLine();
int screenSize = Convert.ToInt32(Console.ReadLine());
string network = Console.ReadLine();
// TODO: Создайте объект SmartTV с входными значениями
// TODO: Сохраните тот же объект TV в трёх разных типах переменных:
// 1. тип SmartTV (конкретный класс)
// 2. IControllable type (interface reference)
// 3. INetworkConnected type (interface reference)
// TODO: Выведите вывод в требуемом формате:
// Via SmartTV:
// - Вызовите TurnOn() и Connect(network)
// Via IControllable:
// - Вызовите TurnOff()
// Via INetworkConnected:
// - Вызовите Connect(network)
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методовПотренируйтесь самостоятельно: Онлайн-компилятор C#