Andriy Shyrokoryadov

.Net developer, data scientist

Что такое интерфейс - вопрос №6 на собеседование C# / .NET

Текст к видео "Что такое интерфейс" на канале YouTube

Прежде чем мы дадим формальное определение интерфейсу, я хотел бы разобрать несколько примеров. Обратимся к примеру класса «Телевизор», который был использован при объяснении разницы между объектом и классом. Телевизор имеет определённые свойства и функционал. К свойствам можно отнести его вес и габаритные размеры, а к функционалу – способность отображать видео файлы. Давайте вес и габаритные размер объединим в группу «Габаритно-весовые характеристики», а функционал назовем например «Воспроизведение видео в формате MP4». Класс «Телевизор» реализует в себе группы «Габаритно-весовые характеристики» и «Воспроизведение видео в формате MP4». Какие предметы техники могут реализовать вышеуказанные группы? Ноутбук, мобильный телефон, персональный компьютер, проектор. Назовем эти объекты как «объекты, имеющие габаритно весовые характеристики» или «объекты, воспроизводящие видео в формате МР4». Если мы знаем, что у нас есть объект, имеющий габаритно-весовые характеристики, то независимо от того, что это за объект (телевизор или ноутбук), мы можем получить значение веса и габаритных размеров данного объекта. То есть по сути нас не интересует, что перед нами, но мы точно знаем, что это «что-то» имеет вес и габаритные размеры.

То же самое с объектами, воспроизводящими видео в формате МР4. Мы не знаем, что у нас за объект, но если дано, что данный объект может воспроизвести видео в формате МР4, то мы можем быть уверены, что видео будет воспроизведено. Не важно на телефоне или ноутбуке, на телевизоре или при помощи проектора. Для нас главное, что этот объект обладает определенным функционалом – функционалом воспроизведения видео в определенном формате.

А теперь вернёмся к определению интерфейса. Книжное определение звучит так – интерфейс — это набор абстрактных членов, которые декларируют определённый функционал. Создавать объекты интерфейса нельзя, однако можно создавать классы, которые будут реализовывать данный интерфейс. Вернемся к предыдущему примеру - группы «Габаритно-весовые характеристики» и «Воспроизведение видео в формате MP4» являются интерфейсами. Интерфейс «Габаритно-весовые характеристики» имеет 2 свойства: вес и габаритные размеры. Интерфейс «Воспроизведение видео в формате MP4» имеет 1 метод: «Воспроизвести». Телевизор, ноутбук, мобильный телефон, ПК, проектор – это классы, которые имплементируют интерфейсы «Габаритно-весовые характеристики» и «Воспроизведение видео в формате MP4». Исходя их этого, чтобы получить вес объекта, нам не надо знать, что это за объект, достаточно будет знать, что он имплементирует интерфейс «Габаритно-весовые характеристики» и обратиться к свойству «Вес». Также и с интерфейсом «Воспроизведение видео в формате MP4» если мы знаем, что объект имплементирует этот интерфейс то, по сути, нам не важно, чем является этот объект – результат будет таким же: воспроизведение видео.

Чтобы упростить понимание чем является интерфейс, представим ситуацию – у вас есть ноутбук с портом HDMI и кабель HDMI. Обладая этими вещами, вы легко можете сказать, что ваш ноутбук можно подключить к любому телевизору, у которого есть порт HDMI. В этом случае порт HDMI это интерфейс. Не важно кто производитель этого телевизора или какой размер диагонали телевизора. Если телевизор реализует интерфейс «Порт HDMI», то ваш ноутбук легко можно к нему подключить.

Иногда можно услышать вопрос – что можно декларировать в интерфейсе. В языке C# можно декларировать 4 типа членов: методы, свойства, события и индексы.