Лекция 6


Чтобы посмотреть презентацию с картинками, оформлением и слайдами, скачайте ее файл и откройте в PowerPoint на своем компьютере.
Текстовое содержимое слайдов презентации:

Лекция 6. Интерфейсы Интерфейсы Интерфейс определяет набор методов, Которые будут реализованыклассом. Сам интерфейс не реализует методы. Интерфейсы синтаксически подобны абстрактным классам. Однако винтерфейсе ни один метод не может включать тело, т.е. интерфейс впринципе не предусматривает какой бы то ни было реализации.interface имя{тип_возврата имя_метода1 {список_параметров) ;тип_возврата имя_метода2 {список_параметров) ;// . . .тип_возврата имя_методаЫ(список_параметров) ;}В интерфейсе методы неявно являются открытыми (public-методами),при этом не разрешается явным образом указывать спецификатордоступа. Реализация интерфейсов clas s имя_класса : имя__интерфейса {// тело класса}Если класс реализует интерфейс, он должен это сделать в полном объеме.Классы могут реализовать несколько интерфейсов. В этомслучае имена интерфейсов отделяются запятыми. Классможет наследовать базовый класс и реализовать одинили несколько интерфейсов. В этом случае списокинтерфейсов должно возглавлять имя базового класса.Методы, которые реализуют интерфейс, должны бытьобъявлены открытыми. Использование интерфейсных ссылок Можно объявить ссылочную переменную интерфейсного типа. Т.е. можно создать переменнуюссылку на интерфейс. Такая переменная можетссылаться на любой объект, который реализует ееинтерфейс. При вызове метода для объектапосредством интерфейсной ссылки будет выполнената версия указанного метода, которая реализованаэтим объектом. Этот процесс аналогичениспользованию ссылки на базовый класс для доступак объекту производного класса Пример public interface ISeries {int getNext(); void reset(); void setStart(int x);}class ByTwos : Iseries {…}class ByOnes : Iseries {…} class SeriesDemo2 {public static void Main() {ByTwos twoOb = new ByTwos();ByOnes oneOb = new ByOnes ();ISeries ob;Ob=twoOb;Ob.getNext(); // Метод из класса ByTwos Ob=oneOb;Ob.getNext(); // Метод из класса ByOnes }} Интерфейсные свойства и индексаторы Как и методы, свойства определяются винтерфейсе без тела. // Интерфейсное свойствотип имя{get;set; }В интерфейсе можно определить и индексатор. // Интерфейсный индексатортип_элемента this[int индекс]{get;set ;} Наследование интерфейсов Если класс реализует интерфейс, которыйнаследует другой интерфейс, этот классдолжен обеспечить способы реализации длявсех членов, определенных внутри цепочкинаследования интерфейсов.В производном интерфейсе можно объявить член,который скрывает член, определенный в базовоминтерфейсе. Это происходит при совпадении их сигнатур.Такое совпадение вызовет предупреждающее сообщение,если член производного интерфейса не модифицировать спомощью ключевого слова new. Явная реализация членов интерфейса При реализации члена интерфейса можноквалифицировать его имя с использованиемимени интерфейса. В этом случае говорят, чточлен интерфейса реализуется явнымобразом, или имеет место его явнаяреализация. interface IMyiF {int myMeth(int x);}class MyClass : IMyIF{int IMyIF.myMeth(int x) {return x / 3;} Причины использования Закрытая реализация interface IEven { bool isOdd(int x) ; bool isEven(int x) ; } class MyClass : IEven { // Явная реализация, bool IEven.isOdd(int x) { if((x%2) != 0) return true; else return false; } // Обычная реализация, public bool isEven(int x) { IEven о = this; return !o.isOdd(x); }} class Demo { public static void Main() { MyClass ob = new MyClass() ; bool result ; result = ob.isEven(4) ; If ( result ) Console.WriteLine(" 4 - четное число . " ) ; else Console.WriteLine("3 - нечетное число."); // result = ob.isOdd(); // Ошибка, член не виден.}} метод isOdd() реализован в явном виде, он недоступен вне классаMyClass. Такой способ реализации делает его надежно закрытым. Внутри классаMyClass к методу isOdd() можно получить доступ только через ссылку на интерфейс. Неопределенность при явной реализации interface IMyIF_A { int meth(int x) ; } interface IMyIF_B { int meth(int x) ; } // В классе MyClass реализованы оба интерфейса, class MyClass : IMyIF_A, IMyIF_B { // Явным образом реализуем два метода meth(). int IMyIF_A.meth(int x) { return x + x; } int IMyIF_B.meth(int x) { return x * x; } // Вызываем метод meth() посредством ссылки на интерфейс, public int methA(int x){ IMyIF_A a_ob; a_ob = this; return a_ob.meth(x); // Имеется в виду интерфейс IMyIF_A. } public int methB(int x){ IMyIF_B b_ob; b_ob = this ; return b_ob.meth(x) ; / / Имеется в виду интерфейс IMyIF_B }} Базовый класс или интерфейс Связь потомка с предком. Любой тип может наследовать только одну реализацию. Если производный тип не может ограничиваться функциональностью базового, нужно применять интерфейс, а не базовый тип.Простота использования. Разработчику проще определить новый тип, производный от базового, чем создать интерфейс. Базовый тип может предоставлять массу функций, и в производном типе потребуется внести лишь незначительные изменения, чтобы изменить его поведение. При создании интерфейса в новом типе придется реализовывать все члены. Управление версиями. Когда вы добавляете метод к базовому типу, производный тип наследует стандартную реализацию этого метода без всяких затрат. Пользовательский исходный код даже не нужно перекомпилировать. Добавление нового члена к интерфейсу требует изменения пользовательского исходного кода и его перекомпиляции. Задание Создать интерфейс IСipher, который определяет методы поддержки шифрования строк (кодирование/ декодирование). На основе разработанного интерфейса создать два класса SimpleCipher BitCipher. Первый шифрует строку посредством сдвига каждого символа на одну алфавитную позицию выше. Второй – каждый символ заменяется результатом операции исключающего или примененной к этому символу и некоторому 16-разрядному значению, которое используется в качестве ключа.

Приложенные файлы

  • ppt 919608
    Размер файла: 164 kB Загрузок: 0

Добавить комментарий