Интерфейсом называют особый класс, который инкапсулирует абстрактный набор функциональных возможностей. Объявляется интерфейс с помощью специального ключевого слова interface: interface IИмя {содержимое}.
Интерфейс обладает следующими особенностями:
- Может содержать только объявления методов или свойств (без определений). Такие элементы называют абстрактными. Иногда говорят, что интерфейс – это чистый протокол. В таком случае модификатор
abstractявным образом использовать не нужно, так как данный режим установлен по умолчанию. - Элементы интерфейса всегда открыты (
publicпо определению) и модификаторы защиты при их объявлении также не указываются. - Имя интерфейса рекомендуют начинать с I.
При объявлении класса или структуры, поддерживающих интерфейс, имя интерфейса указывается в списке базовых классов (по сути это тоже наследование). У структур такой список может состоять только из интерфейсов. Если интерфейс поддерживает производный класс, имя его базового класса в списке должно быть первым. В любом случае все элементы поддерживаемого интерфейса (т.е. абстрактные методы) должны быть определены (реализованы) в классе или структуре, в чем заключается одно из отличий от виртуальных методов, переопределение которых в производном типе может отсутствовать.
В условиях отсутствия в C# множественного наследования от классов интерфейсы позволяют поддержать неограниченное количество вариаций поведения (то есть полиморфизм).
Одна из самых больших трудностей программирования на C# состоит в правильном выборе между интерфейсом и абстрактным классом в тех случаях, когда требуется описать функциональные возможности, но не реализацию.
В подобных случаях рекомендуется придерживаться следующего общего правила: если какое-то понятие можно описать с точки зрения функционального назначения, не уточняя конкретные детали реализации, то следует использовать интерфейс. А если требуются некоторые детали реализации, то данное понятие следует представить абстрактным классом.
Множественное наследование – свойство, поддерживаемое частью объектно-ориентированных языков программирования, когда класс может иметь более одного суперкласса (непосредственного класса-родителя), интерфейсы поддерживают множественное наследование во многих языках программирования.
Интерфейсы позволяют частично справиться с таким существенным недостатком языка, как отсутствие множественного наследования классов. Хотя реализация множественного наследования встречается с рядом проблем, его отсутствие существенно снижает выразительную мощь языка. В языке C# полного множественного наследования классов нет. Чтобы частично сгладить этот пробел, допускается множественное наследование интерфейсов.
Обеспечить возможность классу иметь несколько родителей – один полноценный класс, а остальные в виде интерфейсов, – в этом и состоит основное назначение интерфейсов.
При разработке программы "Журнал" интерфейсы были использованы в качестве аналога множественного наследования. Программа включает в себя три интерфейса:
IStudent(Студент);IAverage_Score(Средний балл);IScholarship(Стипендия).
Интерфейс IStudent реализует следующие методы:
FIO()– задает фамилию, имя и отчество студента;Gender()– определяет пол;Birthday()– получает дату рождения студента в формате дд.мм.гг.;Education()– определяет название института, год обучения и направление учащегося;Address()– адрес студента (город, улица и дом);Phone_Number()– сотовый телефон.
Интерфейс IAverage_Score реализует один метод Average_Score(), высчитывающий средний балл студента, исходя из его оценок, полученных во время последней сессии.
Интерфейс IScholarship также реализует один метод Scholarship(), который на основе оценок, полученных во время последней сессии, делает вывод о том, будет ли студент получать стипендию в следующем семестре.
Далее был создан класс Student, который наследует методы всех трех интерфейсов, и уже в нем подробно описывается каждый. В классе Program создано несколько экземпляров класса Student, подробно разобрана работа методов и по итогу получено некое подобие журнала или ведомости.
IDE - MS Visual Studio 2022
© daniza1103