При множественной реализации интерфейсов мы можем столкнуться с таким поведением: если класс реализует несколько интерфейсов, содержащих член с одинаковой сигнатурой (например, метод), то при реализации такого члена в классе оба интерфейса будут использовать этот член в качестве собственной реализации. Чтобы избежать такого поведения, нам потребуется явная реализация интерфейса. Более того, если в нашем приложении будет большое количество различных классов, реализующих один и тот же интерфейс, то нам необходимо будет реализовать все члены этого интерфейса в каждом классе. Хоть это и не является проблемой, как таковой (это обычная работа с интерфейсами в C# 7.0 и более ранних версиях), однако, начиная с C# 8.0 мы можем создавать реализации по умолчанию непосредственно при определении интерфейса.
Глава 9. Интерфейсы
Наследование и множественная реализация интерфейсов
Когда мы разбирали тему про наследование классов в C#, то было сказано, что классы наследуются последовательно — один класс не может наследовать несколько классов-предков. Что же касается интерфейсов, то одно из ключевых преимуществ, которые дают нам интерфейсы заключается в том, что один класс может реализовывать сразу несколько интерфейсов. Более того, сами интерфейсы могут наследовать другие интерфейсы.
Коллекции объектов. Интерфейсы IEnumerable и IEnumerator
В подавляющем большинстве случаев, возможности платформы .NET покрывают наши потребности в тех или иных классах для хранения и перебора элементов коллекций. Так, в пространствах имен System.Collections
и System.Collections.Generics
содержатся различные уже готовые классы для работы с коллекциями — List<T>
, Stack<T>
и другие, с помощью которых можно реализовать необходимую функциональность. Однако, иногда все же может потребоваться реализовать в программе собственный класс, содержащий массив элементов и способный эти элементы перечислять. В этом случае нам потребуется реализовать в своих классах интерфейсы IEnumerable
и IEnumerator
.
Сортировка объектов произвольного типа. Интерфейс IComparer
В прошлой части мы рассмотрели интерфейс IComparable
, позволяющий сравнивать между собой объекты произвольного типа. Операции сравнения тесно связаны с операцией сортировки различных коллекций. И сегодня мы рассмотрим ещё один интерфейс — IComparer
, который используется для реализации методов сортировки коллекций.
Сравнение произвольных типов в C#. Интерфейс IComparable
Как нам уже известно, для сравнения переменных примитивных типов мы можем использовать различные логические операторы. Однако, при написании своих собственных программ мы далеко не всегда используем только примитивные типы данных — мы можем создавать собственные классы с произвольными наборами свойств. И, в этом случае, мы уже не можем просто воспользоваться логическими операторами для сравнения, так как платформа .NET просто не знает как сравнивать произвольные классы (и можно ли их сравнивать, в принципе). Для сравнения двух объектов произвольного типа мы можем, например, воспользоваться возможностью перегрузки операторов, а можем использовать интерфейс IComparable
.
Клонирование объектов. Интерфейс ICloneable
Напомню, что классы относятся к ссылочным типам данных в C#. В связи с этим, клонирование объектов в C# может вызвать некоторые затруднения у тех, кто только начинает осваивать работы с этим языком программирования. В особенности, когда необходимо скопировать (клонировать) какой-либо объект.
Интерфейсы в C#
Можно встретить достаточно много различных определений, что такое интерфейс в программировании и, в частности, в языке C#. От самых общих, например, «интерфейс — это то по средствам чего что-то взаимодействует с чем-то». До более понятных и конкретных: интерфейс — это контракт о взаимодействии между различными частями системы. При этом, под «системой» понимается не только одна единственная программа, но и совокупность программных средств, разработанных, в том числе, и разными группами разработчиков. Тема интерфейсов в C# — это довольно интересная и, что главное, одна из наиболее важных тем в изучении основ программирования на C#, наряду с классами и делегатами. И сегодня мы начнем эту тему изучать.