* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Реализация полиморфизма через интерфейсы
8 февраля 2009
Интерфейсы определяют поведение класса. Один и тот же интерфейс можно реа- лизовать в самых разных классах, что позволяет им взаимодействовать друг с дру- гом, воплощая концепцию полиморфизма. На этом занятии вы научитесь объяв- лять и реализовывать интерфейсы, а также узнаете, как объекты взаимодействуют через интерфейсы.
Изучив материал этого занятия, вы сможете: ^ определять интерфейсы; S создавать реализацию интерфейса; ^ объяснить, каким образом удается реализовать полиморфизм через интерфейсы. Продолжительность занятия - около 30 минут. В данном контексте интерфейс — это некое соглашение. Любой объект, в кото- ром реализован данный интерфейс, гарантированно содержит реализацию для чле- нов, объявленных в этом интерфейсе. Если объект поддерживает некоторый интер- фейс, любой другой объект, в котором реализован этот интерфейс, окажется спосо- бен взаимодействовать с ним. Интерфейс определяет только члены, реализованные в объекте. В определении интерфейса ничего не говорится о реализации его членов — оно содержит лишь описание типов параметров и возвращаемых значений. Реализация членов, объяв- ленных в интерфейсе, целиком и полностью ложится на класс, в котором этот ин- терфейс реализован. Так, в разных объектах одни и те же члены интерфейса реализуются совершенно по-разному. Рассмотрим интерфейс IShape, определяющий единственный метод — Calculate Area. При этом класс Circle, в котором реализован этот интерфейс, вычис- ляет площадь фигуры совсем не так, как это делает класс Square, в котором также реализован этот интерфейс. Тем не менее объект, которому необходимо взаимо- действовать через IShape, способен вызвать метод CakulaleArea из класса Circle или Square и получить корректный результат. Определение интерфейсов Интерфейсы определяются с помощью ключевого слова Interface (interface), напри- мер, так: Visual Basic .NET Public Interface IDrivable End Interface Visual C# public interface IDrivable {: Этот пример объявляет интерфейс IDrivable, но не определяет ни одного члена этого интерфейса. Методы-члены интерфейса определяют с обычной сигнатурой метода, но без модификаторов доступа, таких, как public, private и др. Модификатор доступа, заданный для интерфейса, определяет уровень доступа для всех его чле- нов. Таким образом, если интерфейс объявлен с модификатором Public, этот моди- фикатор действует для всех его членов. Вот пример определения методов как чле- нов интерфейса: Visual Basic .NET Public Interface IDrivable Sub GoForward(ByVal Speed As Integer) SUD Halt() Function Distance! raveled() As Integer End Interface Visual C# public interface IDrivable { void GoForward(int Speed): void Halt(): int DistanceTraveled(): } Помимо методов, в интерфейсах разрешается определять свойства. На Visual Basic свойства-члены интерфейса необходимо определять с ключевым словом ReadOnly или Write Only. В С# определение свойства включает метод-получатель (getter), метод-установщик (setter) или оба этих метода. Определение свойства за- вершается указанием типа значения, возвращаемого свойством. Вот пример опре- деления свойства: Visual Basic .NET Public Interface IDrivable Определения остальных членов опущены. Это определение свойства, доступного только для чтения. ReadOnly Property FuelLevelO As Integer End Interface Visual C# public interface IDrivable get; // Чтобы сделать это свойство доступным только для чтения, // объявите здесь метод set. В отличие от свойств, поля не могут быть членами интерфейсов. Это гарантиру- ет, что классы, взаимодействующие через интерфейсы, не получат доступ к внут- ренним данным объектов. Интерфейсы также определяют события, генерируемые объектами, в которых этот интерфейс реализован. Любой класс, реализующий некоторый интерфейс, обя- зан предоставлять реализацию для всех событий-членов этого интерфейса, но объекты, взаимодействующие через этот интерфейс, не обязаны обрабатывать все объявленные в нем события. Visual Basic .NET предоставляет тип-делегат по умол- чанию для всех событий, а С# требует явно назначать событиям типы-делегаты. Вот пример определения события, которое является членом интерфейса: Visual Basic .NET Public Interface IDrivable Определения остальных членов опущены. Event OutOfFuel(ByVal sender As Object, e As System.EventArgs) End Interface Visual C# public interface IDrivable { // Определения остальных членов опущены. event System.EventHandler OutOfFuel; } Чтобы определить интерфейс, объявите его с помощью ключевого слова Interface (Visual Basic) или interface (C#) и добавьте к определению интерфейса сигнатуры его членов — методов, свойств и событий.