Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C#

Г. Шилдт - Полный справочник по C# (1160789), страница 61

Файл №1160789 Г. Шилдт - Полный справочник по C# (Г. Шилдт - Полный справочник по C#) 61 страницаГ. Шилдт - Полный справочник по C# (1160789) страница 612019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 61)

В этом случае говорят, что член интерфейса реализуется явным образом, или имеет место его явная реализация. Например, при определении интерфейсаГлава 12. Интерфейсы, структуры и перечисления331interface IMyiF {int myMeth(int x ) ;вполне допустимо реализовать интерфейс IMyiF следующим образом:c l a s s MyClass : IMyIF{i n t IMyIF.myMeth(int x) {r e t u r n x / 3;Как видите, при реализации метода myMethO члена интерфейса IMyiF указывается его полное имя, включающее имя интерфейса.Явная реализация членов интерфейса может понадобиться по двум причинам. Вопервых, реализуя метод с использованием полностью квалифицированного имени, вытем самым обозначаете части закрытой реализации, которые не "видны" коду, определенному вне класса.

Во-вторых, класс может реализовать два интерфейса, которыеобъявляют методы с одинаковыми именами и типами. Полная квалификация именпозволяет избежать неопределенности ситуации. Рассмотрим примеры.Закрытая реализацияСледующая программа содержит интерфейс с именем lEven, который определяетдва метода isEven () и i s Odd (), устанавливающие факт четности и нечетности числа,соответственно. Класс MyClass реализует интерфейс lEven, причем его член isOdd()еализуется явным образом.// Явная реализация члена интерфейса.using System;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);c l a s s Demo {p u b l i c s t a t i c void Main() {MyClass ob = new MyClass();bool r e s u l t ;result = ob.isEven(4);i f ( r e s u l t ) Console.WriteLine("4332- четное ч и с л о .

" ) ;Часть I. Язык С#else Console.WriteLine("3//- нечетное число.");r e s u l t = ob.isOdd(); // Ошибка, член не виден.Поскольку метод isOddO реализован в явном виде, он недоступен вне классаMyClass. Такой способ реализации делает его надежно закрытым. Внутри классаMyClass к методу isOddO можно получить доступ только через ссылку на интерфейс. Вот почему он прекрасно вызывается для объекта о в реализации методаisEven ( ) .Как избежать неопределенности с помощью явной реализацииРассмотрим пример, в котором реализовано два интерфейса, причем оба объявляют метод с именем meth (). В этой ситуации явная реализация используется для того,тобы избежать неопределенности.// Использование явной реализации для того, чтобы избежать// неоднозначности.using System;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;ib_ob = t h i s ;return b_ob.meth(x); // Имеется в виду// интерфейс IMyIF_BГлава 12.

Интерфейсы, структуры и перечисления333c l a s s FQIFNames {p u b l i c s t a t i c void Main() {MyClass ob = new MyClass();Console.Write("Вызов метода IMyIF_A.meth(): " ) ;Console.WriteLine(ob.methA(3));Console.Write ("Вызов метода IMyIF_B.meth(): " ) ;Console.WriteLine(ob.methB(3));IВот результаты выполнения этой программы:Вызов метода IMyIF__A.meth () : бВызов метода IMylFjB.meth(): 9/Обратите внимание на то, что метод meth () имеет одинаковую сигнатуру в интерфейсах lMylF_A и lMylF_B.

Следовательно, если класс MyClass реализует оба эти интерфейса, он должен реализовать каждый метод в отдельности, полностью указав егоимя (с использованием имени соответствующего интерфейса). Поскольку единственный способ вызова явно заданного метода состоит в использовании интерфейснойссылки, метод m e t h ( ) , объявленный в интерфейсе iMyIF__A, создает ссылку на интерфейс iMylF_A, а метод meth(), объявленный в интерфейсе iMylFjB, создаетссылку на интерфейс lMyiF_B. Созданные ссылки затем используются при вызовеэтих методов, благодаря чему можно избежать неоднозначности.Выбор между интерфейсом и абстрактнымклассомВ профаммировании на С# при необходимости описать функции, а не способ ихреализации, важно знать, когда следует использовать интерфейс, а когда — абстрактный класс.

Общее правило таково. Если вы полностью описываете действия класса ине нужно уточнять, как он это делает, следует использовать интерфейс. Если же требуется включить в описание детали реализации, имеет смысл представить концепциюпрограммы (или ее части) в виде абстрактного класса.Стандартные интерфейсы среды .NETFrameworkВ среде .NET Framework определено множество интерфейсов, которые могут использовать Сопрограммы. Например, интерфейс System. IComparable определяетметод CompareTo (), который позволяет сравнивать объекты. Интерфейсы также образуют важную часть коллекции классов, которая обеспечивает различные типы дляхранения групп объектов (например, стеки и очереди).

Так, например, интерфейсS y s t e m . C o l l e c t i o n s . I C o l l e c t i o n определяет функциональность, общую для всехколлекций. Интерфейс System. C o l l e c t i o n s . IEnumerator предлагает способ опросаэлементов в коллекции. Эти и другие интерфейсы мы рассмотрим в части II.334Часть I. Язык С#Учебный проект: создание интерфейсаПрежде чем продолжать изучение других средств профаммирования на С#, былобы полезно рассмотреть пример использования интерфейса.

В этом разделе мы создадим интерфейс i c i p h e r , который определяет методы поддержки шифрования строк.Для этой задачи использование интерфейса вполне оправданно, поскольку здесь можно полностью отделить код с описанием "что" от кода, где указано, "как".Интерфейс I Cipher имеет такой вид:// Интерфейс шифрования и дешифрирования строк,public interface ICipher {s t r i n g encode(string s t r ) ;s t r i n g decode(string s t r ) ;}В интерфейсе ICipher объявляются два метода: encode () и decode ( ) , которыеиспользуются для шифрования и дешифрирования строк, соответственно. При этомдругие детали не уточняются. Это значит, что классы, которые будут реализовыватьэти методы, могут выбирать любой метод шифрования. Например, один класс мог бышифровать строку на основе ключа, определенного пользователем. Другой мог бы использовать защиту с помощью системы паролей.

У третьего механизм действия шифра мог бы опираться на побитовую обработку, а у четвертого — на простую перестановку кода (реализация перестановочного шифра). Главное то, что интерфейс операции шифрования и дешифрирования строк не зависит от используемого способашифрования. А поскольку здесь нет необходимости определять даже часть механизмашифрования, то для его представления мы выбираем средство интерфейса.В нашем учебном проекте интерфейс I C i p h e r реализуют сразу два класса:SimpleCipher и BitCipher.

Класс SimpleCipher шифрует строку посредствомсдвига каждого символа на одну "алфавитную" позицию выше. Например, в результате такого сдвига буква А становится буквой Б, а буква Б — буквой В и т.д. КлассB i t C i p h e r шифрует строку по-другому: каждый символ заменяется результатом операции исключающего ИЛИ, примененной к этому символу и некоторому 16азрядному значению, которое используется в качестве ключа./* Простая реализация интерфейса ICipher, которая кодируетсообщение посредством сдвига каждого символа на1 позицию вверх. Так, буква А превратится вбукву Б и т.д.

*/class SimpleCipher : ICipher {// Метод возвращает зашифрованную строку, заданную// открытым текстом,public s t r i n g encode(string s t r ) {string ciphertext = " " ;for(int i=0; i < str.Length;ciphertext = ciphertext + (char) (str[i] + 1 ) ;return ciphertext;}// Метод возвращает дешифрированную строку, заданную// зашифрованным текстом.\public string decode(string str) {'string plaintext = "";Глава 12. Интерфейсы, структуры и перечисления335for(int i=0; i < str.Length; ^..

,plaintext = plaintext + (char) (str[i] - 1) ;return plaintext;/* В этой реализации интерфейса ICipher используетсяпобитовая обработка и ключ. */class BitCipher : ICipher {ushort key;// Определяем ключ при построении объектов// класса BitCipher.public BitCipher(ushort k) {key = k;// Метод возвращает зашифрованную строку, заданную// открытым текстом,public string encode(string str) {string ciphertext = "";for(int i=0; i < str.Length;ciphertext = ciphertext + (char) (str[i]Лkey);return ciphertext;// Метод возвращает дешифрированную строку, заданную// зашифрованным текстом,public string decode(string str) {string plaintext = "";for(int i=0; i < str.Length;plaintext = plaintext + (char) (str[i]Лkey);return plaintext;Как видите, оба класса SimpleCipher и BitCipher реализуют один и тот же интерфейс ICipher, хотя используют при этом различные способы его реализации.

Вследующей программе демонстрируется функционирование классов SimpleCipher иBitCipher.// Демонстрация использования интерфейса ICipher.using System;class ICipherDemo {public static void Main() {ICipher ciphRef;BitCipher bit = new BitCipher(27);SimpleCipher sc = new SimpleCipher();string plain;string coded;336/Часть I. Язык С#// Сначала переменная ciphRef ссылается на объект// класса SimpleCipher (простое шифрование).ciphRef = sc;Console.WriteLine("Использование простого шифра.");plain = "testing";coded = ciphRef.encode(plain);Console.WriteLine("Зашифрованный текст: " + coded);plain = ciphRef.decode(coded);Console.WriteLine("Открытый текст: " + plain);// Теперь переменная ciphRef refer ссылается на// объект класса BitCipher (поразрядное шифрование).ciphRef = bit;Console.WriteLine("ХпИспользование поразрядного шифрования.11);plain = "testing";coded = ciphRef.encode(plain);Console.WriteLine("Зашифрованный текст: " + coded);plain = ciphRef.decode(coded);Console.WriteLine("Открытый текст: " + plain);Вот результаты выполнения этой программы:Использование простого шифра.Зашифрованный текст: uftujohОткрытый текст: testingИспользование поразрядного шифрования.Зашифрованный текст: o~horu|Открытый текст: testingОдно из достоинств создания интерфейса шифрования состоит в том, что доступ клюбому классу, который реализует этот интерфейс, осуществляется одинаково, независимо от того, как реализован процесс шифрования.

Например, рассмотрим следующую программу, в которой класс UnlistedPhone используется для хранения телефонных номеров в зашифрованном формате. При необходимости имена и цифрыномера автоматически дешифруются.// Использование интерфейса ICipher.using System;// Класс для хранения телефонных номеров,class UnlistedPhone {string pri_name;// Поддерживает свойство Name.string pri_number; // Поддерживает свойство Number.ICipher crypt; // Ссылка на объект шифрования.public UnlistedPhone(string name, string number,ICipher c)Глава 12.

Интерфейсы, структуры и перечисления337crypt = с; // Хранит объект шифрования.pri__name = crypt. encode (name) ;pri_number = crypt.encode(number);public string Name {get {return crypt.decode(pri_name);}set {pri__name = crypt.encode(value);public string Number {get {return crypt.decode(pri_number);}set {pri_number = crypt. encode (value) ;// Демонстрируем использование класса UnlistedPhone.class UnlistedDemo {public static void Main() {UnlistedPhone phonel =new UnlistedPhone("TOM", "555-3456",new BitCipher(27));UnlistedPhone phone2 =new UnlistedPhone("Мэри", "555-8891",new BitCipher(9));Console.WriteLine("Телефонный номер абонента по имени "+ phonel.Name + " : "+ phonel.Number);Console.WriteLine("Телефонный номер абонента по имени "+ phone2.Name + " : "+ phone2.Number);(Вот результаты выполнения этой программы:Телефонный номер абонента по имени Том : 555-3456Телефонный номер абонента по имени Мэри : 555-8891Рассмотрим, как реализован класс UnlistedPhone.

Характеристики

Тип файла
PDF-файл
Размер
24,15 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6458
Авторов
на СтудИзбе
304
Средний доход
с одного платного файла
Обучение Подробнее