Расширенные возможности языка программирования C#
Теоретические сведения
Интерфейсы
В языке программирования C# с целью изоляции описательной части класса от его реализации используется механизм интерфейсов.
Понятие интерфейса является расширением идеи абстрактных классов и методов. Синтаксис интерфейсов подобен синтаксису абстрактных классов. Объявление интерфейсов осуществляется с помощью ключевого слова interface. При этом методы интерфейса не поддерживают реализации.
Членами интерфейса могут быть методы, свойства, индексаторы и события.
Интерфейс может реализовываться произвольным количеством классов. Один класс, в свою очередь, может реализовывать любое число интерфейсов.
Каждый класс, включающий интерфейс, должен реализовывать его методы. В интерфейсе для методов неявным образом присутствует модификатор доступа типа public. При этом явное указание модификатора доступа недопустимо.
Описание интерфейса
Синтаксис:
[атрибуты] [модификаторы] interface Имя_интерфейса[ :список_родительских_интерфейсов] { обьявление_свойств_и_методов}
Пример:
interface Species { string Species(); void Feed(); } class Cheetah:Animal,Species{ private string ScientificName; public string Species() { return ScientificName; } public void Feed() { Weight++; } }
В языке C# допустимо объявление ссылочных переменных интерфейсного типа. Такие переменные могут ссылаться на любой объект, реализующий их интерфейсы. При вызове метода объекта по интерфейсной ссылке происходит вызов той конкретизации метода, которая реализуется данным объектом.
В языке C# допустимо наследование интерфейсов. При этом синтаксис аналогичен таковому для наследования классов. В случае, если класс реализует интерфейс, который наследует другой интерфейс, необходимо предусмотреть реализацию всех членов, определенных в составе иерархии наследования интерфейсов.
Делегаты
Под делегатом будем понимать объект, который имеет ссылку на метод. Делегат позволяет осуществлять выбор вызываемого метода во время выполнения программы. Фактическим значением делегата является адрес области оперативной памяти, по которому распложена точка входа метода.
Важным свойством делегата является то, что он позволяет указать в коде программы вызов метода, однако фактически вызываемый метод определяется во время выполнения программы, а не во время ее компиляции.
Делегат объявляется с помощью ключевого слова delegate, за которым указывается тип возвращаемого значения, имя делегата и список параметров вызываемых методов.
Описание делегата
Синтаксис:
delegate тип_возвращаемого_значения имя_делегата (список_параметров);
Характерной особенностью делегата является возможность его использования для вызова любого метода, который соответствует подписи делегата. Это дает возможность определить, какой из методов должен быть вызван, во время выполнения программы. Вызываемый метод может быть методом экземпляра, ассоциированным с объектом, либо статическим методом, ассоциированным с классом. Метод можно вызывать только в том случае, если его подпись соответствует подписи делегата.
Многоадресность делегатов
Многоадресность - это способность делегата хранить несколько ссылок на различные методы, что позволяет при вызове делегата инициировать эту цепочку методов.
Для формирования цепочки методов следует создать экземпляр делегата, и, пользуясь операторами " + " или " += ", добавлять методы к цепочке. Для удаления метода из цепочки используется оператор " - " или " -= ". Делегаты, хранящие несколько ссылок, должны иметь тип возвращаемого значения void.
Порядок выполнения работы
- Реализовать программу на C# в соответствии с вариантом исполнения.
- Для проверки всех методов данного класса следует использовать многоадресный делегат.
Варианты заданий
Реализовать для иерархии из лабораторной работы №8 механизм интерфейсов, при этом один из классов должен реализовывать как минимум два интерфейса. Использовать для проверки всех методов данного класса многоадресный делегат.