|
Программирование >> Обработка исключительных ситуаций
interface IBase void АО; class Base : IBase public virtual void AO { class Derived: Base public override void AO { Derived d = new Derived () : d.AO; IBase id = d; id.AO; вызывается Derived.AO; вызывается Derived.AO; Метод интерфейса, реализованный явным указанием имени, объявлять виртуальным запрещается. При необходимости переопределить в потомках его поведение пользуются следующим приемом: из этого метода вызывается другой, защищенный метод, который объявляется виртуальным. В приведенном далее примере метод А интерфейса IBase реализуется посредством защищенного виртуального метода А , который можно переопределять в потомках класса Base: interface IBase { void AO; class Base : IBase { void IBase.AO { A (); } protected virtual void A () { class Derived: Base protected override void A () { Существует возможность повторно реализовать интерфейс, указав его имя в списке предков класса наряду с классом-предком, уже реализовавшим этот интерфейс. При этом реализация переопределенных методов базового класса во внимание не принимается: interface IBase void АО; class Base : IBase void IBase.A() { не используется в Derived class Derived : Base, IBase public void AO { ... } Если класс наследует от класса и интерфейса, которые содержат методы с одинаковыми сигнатурами, унаследованный метод класса воспринимается как реализация интерфейса, например: interface Interfacel void FO: class Classl public void F() { ... } pub1 ic void GO { ... } class Class-2 Classl. Interfacel new public void GO { Здесь класс Class2 наследует от класса Classl метод F. Интерфейс Interfacel также содержит метод F. Компилятор не выдает ошибку, потому что класс Class2 содержит метод, подходящий для реализации интерфейса. Вообще при реализации интерфейса учитывается наличие подходящих методов в классе независимо от их происхождения. Это могут быть методы, описанные в текущем или базовом классе, реализующие интерфейс явным или неявным образом. Стандартные интерфейсы .NET В библиотеке классов . NET определено множество стандартных интерфейсов, задающих желаемое поведение объектов. Например, интерфейс IComparable задает метод сравнения объектов по принципу больше или меньше, что позволяет выполнять их сортировку. Реализация интерфейсов lEnumerable и enumerate дает возможность просматривать содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable - клонировать объекты. Стандартные интерфейсы поддерживаются многими стандартными классами библиотеки. Например, работа с массивами с помощью цикла foreach возможна именно потому, что тип Array реализует интерфейсы lEnumerable и lEnumerator. Можно создавать и собственные классы, поддерживающие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами. Сравнение объектов (интерфейс IComparable) Интерфейс IComparable определен в пространстве имен System. Он содержит всего один метод CompareTo, возвращающий результат сравнения двух объектов - текущего и переданного ему в качестве параметра: interface IComparable int CompareTo( object obj ) Метод должен возвращать: 0, если текущий объект и параметр равны; отрицательное число, если текущий объект меньше параметра; положительное число, если текущий объект больше параметра. Реализуем интерфейс IComparable в знакомом нам классе Monster. В качестве критерия сравнения объектов выберем поле health. В листинге 9.1 приведена программа, сортирующая массив монстров по возрастанию величины, характеризующей их здоровье (элементы класса, не используемые в данной программе, не приводятся). Листинг 9.1. Пример реализации интерфейса IComparable jsing System; iamespace Consol eAppl ication i class Monster : IComparable public MonsterC int. health, int ammo, string name ) this.health = health; this.ammo = ammo: this.name = name; virtual public void PassportO Console.WriteLineC Monster {0} \t health = {1} ammo = {2} , name, health, ammo ); public int CompareToC object obj ) реализация интерфейса продолжение
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |