Интерфейсы чаще всего используются для задания общих свойств объектов различных иерархий. Основная идея интерфейса состоит в том, что к объектам классов, реализующих интерфейс, можно обращаться одинаковым образом, при этом каждый класс может определять элементы интерфейса по-своему. Если некий набор действий имеет смысл только для какой-то конкретной иерархии классов, реализующих эти действия разными способами, уместнее задать этот набор в виде виртуальных методов абстрактного базового класса иерархии.
В С# поддерживается одиночное наследование для классов и множественное -для интерфейсов. Это позволяет придать производному классу свойства нескольких базовых интерфейсов. Класс должен определять все методы всех интерфейсов, которые имеются в списке его предков.
В библиотеке.NET определено большое количество стандартных интерфейсов. Реализация стандартных интерфейсов в собственных классах позволяет использовать для объектов этих классов стандартные средства языка и библиотеки.
Например, для обеспечения возможности сортировки объектов стандартными методами следует реализовать в соответствующем классе интерфейсы IComparable или IComparer. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable — клонировать объекты.
Использование итераторов упрощает организацию перебора элементов и позволяет задать для одного и того же класса различные стратегии перебора.
Область применения структур — типы данных, имеющие небольшое количество полей, с которыми удобнее работать как со значениями, а не как со ссылками. Накладные расходы на динамическое выделение памяти для экземплятров небольших классов могут весьма значительно снизить быстродействие программы, поэтому их эффективнее описывать как структуры.
Преимущество использования перечислений для описания связанных между собой значений состоит в том, что это более наглядно и инкапсулировано, чем россыпь именованных констант. Кроме того, компилятор выполняет проверку типов, а интегрированная среда разработки подсказывает возможные значения констант, выводя их список.
Делегаты, события и потоки выполнения 1
В этой главе рассматриваются делегаты и события — два взаимосвязанных средства языка С#, позволяющие организовать эффективное взаимодействие объектов. Во второй части главы приводятся начальные сведения о разработке многопоточных приложений.