
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .NET
- •Создание исходной программы
- •Тестовая поездка
- •Каркас программы
- •Комментарии
- •Введение в хитрости панели элементов
- •Повторное использование кода из панели элементов
- •Правила объявления переменных
- •Вариации на тему int
- •Объявление переменной с плавающей точкой
- •Ограничения переменных с плавающей точкой
- •Объявление переменных типа decimal
- •Сравнение десятичных и целых чисел, а также чисел с плавающей точкой
- •Логичен ли логический тип
- •Символьные типы
- •Что такое тип-значение
- •Неизменяемость строк
- •Основные операции над строками
- •Сравнение строк
- •Сравнение без учета регистра
- •Отличие строк в разных регистрах
- •Преобразование символов строки в символы верхнего или нижнего регистра
- •Поиск в строках
- •Как искать
- •Пуста ли строка
- •Удаление пробельных символов
- •Анализ числового ввода
- •Обработка последовательности чисел
- •Объединение массива строк в одну строку
- •Арифметика
- •Простейшие операторы
- •Порядок выполнения операторов
- •Оператор инкремента
- •Сравнение чисел с плавающей точкой
- •Составные логические операторы
- •Вычисление типа операции
- •Типы при присваивании
- •Перегрузка операторов
- •Ветвление с использованием if и switch
- •Инструкция if
- •Инструкция else
- •Как избежать else
- •Вложенные инструкции if
- •Конструкция switch
- •Циклы
- •Цикл без счетчика
- •Правила области видимости
- •Пример
- •Зачем нужны разные циклы
- •Зачем нужны массивы
- •Массив фиксированного размера
- •Массив переменного размера
- •Свойство Length
- •Инициализация массивов
- •Понятие <т>
- •Обобщенные коллекции
- •Инстанцирование пустого списка
- •Создание списка целых чисел
- •Преобразования списков в массивы и обратно
- •Подсчет количества элементов в списке
- •Поиск в списках
- •Инициализаторы массивов и коллекций
- •Выполнение специфичных для множеств задач
- •Создание множества
- •Добавление элемента в множество
- •Выполнение объединения
- •Пересечение множеств
- •Получение разности
- •Не используйте старые коллекции
- •Обход каталога файлов
- •Начало программы
- •Получение начальных входных данных
- •Создание списка файлов
- •Форматирование вывода
- •Вывод в шестнадцатеричном формате
- •Обход коллекций: итераторы
- •Доступ к коллекции: общая задача
- •Использование foreach
- •Формат индексатора
- •Блок итератора
- •Создание каркаса блока итератора
- •Итерирование дней в месяцах
- •Что же такое коллекция
- •Синтаксис итератора
- •Блоки итераторов произвольного вида и размера
- •Обобщенные классы безопасны
- •Обобщенные классы эффективны
- •Очередь с приоритетами
- •Распаковка пакета
- •Написание обобщенного кода
- •Использование простого необобщенного класса фабрики
- •Незавершенные дела
- •Ковариантность
- •Использование механизма исключений для сообщения об ошибках
- •Что происходит при генерации исключения
- •Исключительный пример
- •Что делает этот пример "исключительным"
- •Трассировка стека
- •Советы по написанию кода с хорошей обработкой ошибок
- •Анализ возможных исключений метода
- •Как выяснить, какие исключения генерируются теми или иными методами
- •Генерирующие исключения выражения
- •Работа с перечислениями
- •Создание перечислений с инициализаторами
- •Указание типа данных перечисления
- •Применение перечислений в конструкции switch
- •Процедурные поездки
- •Объектно-ориентированные поездки
- •Определение класса и объекта
- •Определение класса
- •Что такое объект
- •Различие между объектами
- •Работа со ссылками
- •Классы, содержащие классы
- •Определение константных членов-данных и членов-данных только для чтения
- •Передача аргументов методу
- •Передача методу нескольких аргументов
- •Соответствие определений аргументов их использованию
- •Перегрузка методов
- •Реализация аргументов по умолчанию
- •Возврат значения оператором return
- •Кортеж с двумя элементами
- •Создание кортежей более чем с двумя элементами
- •Глава 14 Поговорим об этом
- •Определение методов
- •Определение статического метода
- •Определение метода экземпляра
- •Полное имя метода
- •Ключевое слово this
- •Когда this используется явно
- •Что делать при отсутствии this
- •Использование локальных функций
- •Прочие уровни безопасности
- •Методы доступа
- •Пример управления доступом
- •Выводы
- •Статические свойства
- •Побочные действия свойств
- •Дайте компилятору написать свойства для вас
- •Методы и уровни доступа
- •Замена конструктора по умолчанию
- •Конструирование объектов
- •Непосредственная инициализация объекта
- •Конструирование с инициализаторами
- •Инициализация объекта без конструктора
- •Определение свойств с кодом
- •Определение конструкторов и деструкторов с кодом
- •Определение методов доступа к свойствам с кодом
- •Определение методов доступа к событиям с кодом
- •Наследование класса
- •Более сложный пример наследования
- •ЯВЛЯЕТСЯ или СОДЕРЖИТ
- •Доступ к BankAccount через содержание
- •Отношение СОДЕРЖИТ
- •Заменяемость классов
- •Неверное преобразование времени выполнения
- •Указание конкретного конструктора базового класса
- •Обновленный класс BankAccount
- •Перегрузка унаследованного метода
- •Простейший случай перегрузки метода
- •Различные классы, различные методы
- •Сокрытие метода базового класса
- •Вызов методов базового класса
- •Что неверно в стратегии использования объявленного типа
- •Использование is для полиморфного доступа к скрытому методу
- •Объявление метода виртуальным и перекрытие
- •Получение максимальной выгоды от полиморфизма
- •Разложение классов
- •Абстрактный класс: ничего, кроме идеи
- •Как использовать абстрактные классы
- •Создание абстрактных объектов невозможно
- •Опечатывание класса
- •Реализация интерфейса
- •Именование интерфейсов
- •Наследование и реализация интерфейса
- •Преимущества интерфейсов
- •Тип, возвращаемый методом
- •Что скрыто за интерфейсом
- •Гибкие зависимости через интерфейсы
- •Реализация отношения СОДЕРЖИТ с помощью интерфейсов
- •Определение делегата
- •Пример передачи кода
- •Делегирование задания
- •Очень простой первый пример
- •Более реальный пример
- •Создание приложения
- •Жизненный цикл делегата
- •Анонимные методы
- •Проектный шаблон Observer
- •Что такое событие. Публикация и подписка
- •Как издатель оповещает о своих событиях
- •Как подписаться на событие
- •Как опубликовать событие
- •Как наблюдатели "обрабатывают" событие
- •Сборки
- •Выполнимые файлы
- •Библиотеки классов
- •Создание проекта библиотеки классов
- •Создание автономной библиотеки классов
- •Создание классов для библиотеки
- •Использование тестового приложения
- •Дополнительные ключевые слова для управления доступом
- •protected: поделимся с подклассами
- •protected internal: более изощренная защита
- •Размещение классов в пространствах имен
- •Объявление пространств имен
- •Пространства имен и доступ
- •Использование полностью квалифицированных имен
- •Ссылочные типы
- •Выходные параметры
- •Альтернативные методы возврата значений
- •Работа с переменными out
- •Возврат значений по ссылке
- •Различия типов-значений
- •Когда следует использовать структуры
- •Добавление распространенных элементов структур
- •Управление отдельной записью
- •Добавление структур в массивы
- •Перекрытие методов
- •Определение того, что следует защищать
- •Документирование компонентов программы
- •Разложение компонентов на функции
- •Оценка рисков
- •Аутентификация с использованием входа в Windows
- •Безопасность развертывания
- •Уязвимости сценариев
- •Наилучшие методы защиты приложений Web Forms
- •Получение данных
- •Настройка образца схемы базы данных
- •Подключение к источнику данных
- •Работа с визуальными инструментами
- •Написание кода для работы с данными
- •Использование Entity Framework
- •Где водится рыба: файловые потоки
- •Потоки
- •Читатели и писатели
- •Пример использования потока
- •Как это работает
- •Наконец-то мы пишем!
- •Использование конструкции using
- •Загрузка файла из Интернета
- •Регистрация сетевой активности
- •Графика
- •Перья
- •Кисти
- •Текст
- •Классы рисования и каркас .NET
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

и Ведн еиаоавее аоевиe. пии заноеи аАоиидн оивхи еиаоавепвеи аиоАесакоееоиатиеи12но,
Что скрыто за интерфейсом
|
#.#)(-. |
|
) ,'1$6" - |
'1#))(,1#('1$)#. |
,!, |
,!(!'1,. |
|
#o'1#1t1$)#'1 |
)#(,1$К '1! |
o,!em |
|
|||||||||||
(!'1,. |
|
,(! |
|
(! |
,'1-6!. |
В, |
$"'1(o$)1t1!...-"( |
|
Жд ) Г))!$0 |
1t1'1! |
'1#(,1(,1#0В,!'1".'1! |
|
||||||||||
), |
(,1!."(" |
|
.,(. |
|
))!$(,1 |
)!.)()"'1'1,(,1 |
|
,.$"'1(!(,1o_ |
|
е!1t1-)($(,1 |
|
), |
$(,1""(" |
)(!.. |
|
|||||||
).!.'1,. |
|
|
$.$ |
0$('1!-(,1'1,. |
|
,.#)) |
|
.(! |
'1" 0!($(" |
1t1!.'1!)(.. |
|
1t1'1",!)(#).-(. |
|
|
Жд |
Г |
||||||
!(,'1,(,. |
|
|
$'1("'1S".) |
,.$"'1(#(,1 |
|
'1#1t1'1$(,1"'1 !'1 |
),...#"( |
|
'1",!(!'1," |
|
|
!1t1#)'1," |
|
|||||||||
!1t1"'1#а$$Я |
,! |
!'1," |
'1" |
,!..'1, |
|
.,(. |
,!)(-1t1'1, |
))"(,1 |
1t1!,'1- |
, |
Л $,"#." |
), |
|
0!($(" |
|
|||||||
1t1'1",!)(#).-(. |
|
|
))"(,1 '1".!..E!" |
|
|
.".!1t1#)'1!" |
1t1!,(,1'1!.")()! |
|
!(,'1,(,0 |
|
|
(,1"(!,!)ы |
|
|||||||||
),'1,)#- |
|
1t1'1$ |
T(!(,1 |
,'1-6$" |
.!."" |
|
!1t1#)'1," |
'1("'1S".), |
_w |
1t1!.)!.-.( |
|
|
'1"E$(. |
|
||||||||
$ T(- |
.#, |
#.-_ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Л!( |
"O" |
!,$'1 |
,.#)) |
r$. |
$ |
'10_" 2'1",!(!'1," |
|
(,1"(!,, |
$ |
))!.)()# |
|
,!(!'1!6! |
(,1!em |
|
|||||||
6- ( |
.".!1t1#)'1! |
|
$)1t1!...!)#(.)- |
|
|
,#." |
'1!)$.,#(,1$ |
!( 1t1'1!6'1#(,1(,1$'1!)#'1$-n |
|
е! - |
|
|||||||||||
,.#))# |
")(. |
$ '1"),!..,! |
.!."" |
|
1t1'1!,)$'1-(,0 |
|
)!.(,1!.'1! |
)(". |
,!(!'1," |
|
|
(,1!6-( |
|
|||||||||
!,#.#(.)- |
|
!1t1#)'1,(,1$ |
) |
'1"-(,1".,0 |
|
'1-,#0 |
|
|
|
|
|
|
|
|
|
|
|
|
Мх.d. w Интерфейсы 421

Сначала разрабатываем интерфейс С#, который предоставляет безопасные методы:
О,
О,
lтzТеперь модифицируем класс Robo z i l l a как реализующий интерфейс. По скольку он уже содержит реализацию требуемых методов, все, что нам надо, - добавить : IRobozillaSafe в заголовок класса:
-о,окито леeоаопокeнаиеbнттRobozilla т тоекоаоеаттовД,.опетантат инттоеlтооеlебкопаеоbиееаирокыостIRobozillaSafe. #нсаоттеалеbаоп\ рнлткоптатеbраитаниlакетниариетеВеl.оеанRobozilla, иетебткнтнсао одеенеттоbеыинаирокыостEтеренеюрепоbноатр,ка ,елета танралотееде лоаепн ынlкапеабlнтbппеодет еbнттRobozilla):
|
|
ь |
|
|
|
О |
, |
О |
, |
О |
, |
cетbо реВеbаопаоледыат,еbибетнриRobozilla ,кало.иеане
О ,
О,
н,
.ре рне,кетаеocеткоптртелаиаокыостнеиаледыртоботнаиаолоаепо Robozilla, еерекооыенбниот аирокыостоиоS lеbооаеВез е ет,окалеeор кнбкыzааитнzыапаbbай,кетаол,катопоиаолаа,н
О,
ЧАСТЬ 2 тaфдгтеожо авдетваотрееоди жаощар яяв аотревди ерииси

|
САЕТОПB'txИЗ СВtxВНИВЗООС1ЕМСВЕТАНОЕТОСОЕТ1 МО1МССЕТСААЕПОИНС |
|||
|
ООППВОcИ3oПОАООПЕОБЕТОB ПО1МОПНВЕТООЗBBaОВНОИ1ЗВНИЕТЕООППВОКИ |
|||
|
cИ3 |
МНВАО1ВСМtxВaВВО ОПСААСЕТОЗНИЕТВ'ЕТОПОПB'ВННСНААЕПОС |
||
СОВЕТ |
ЗО!ВЕТBОС1ЕМСЕТЕНС ИАrОВНB3 ООППВОcИ3МОПСААВiЗВННОi |
ПОБЕТО |
||
|
||||
|
ЗB |
c, •НСПСИЗВСS ПСВВОАЕТСМПНВЕТo ЗВЕТОВe, КИBs |
iscj MООЕТОСЕИ |
|
|
МО1МССoСВЕТООППВОcИ3SООЕТОСB3НВПЕ1НИ1ЗВННЕТЕ |
|
|
1 a
·
ОЕТНИНЕТВСtВИА1ВВАЕНВИАПОПЕ1BВЕТАННСM1НС'ВНИВВСННОaОСВtxВНИНЕТО!В
АСЗОВЕТ
ГЛАВА 1 8 Интерфейсы 423

Наследова.ние интерфейс;ов
Интерфейс С# может "наследовать" методы другого интерфейса. Кавычки
япоставил потому, что это не истинное наследование - не важно, на что оно
при этом похоже. В приведенном далее коде в заголовке указывается эvт eх,ы
#дьдгnд,лвы очень похожий на базовый класс:
?им -,х щ(,a1р' р :ruщ6щ-, р a, , цц
цц |
к . к |
С помощью "наследования" интерфейсом IRobozillaSafe интерфейса IPet вы можете заставить данное подмножество Robozilla реализовать собствен ную "одомашненность" без навязывания неподходящих свойств:
))rщ |
,, |
1р'р г 1р' р |
Rrащ, |
|
a, , |
|
|
|
a1р' р |
:umrщ6щ-,цц П |
|
||
|
цц |
|
1р' |
р :rzщ |
. . . |
|
|
цц |
|
a1р'р :xащ6щ,-D |
|
||
|
ц ц |
a, , |
a , , |
т |
|
|
|
цц |
Н |
|
|
|
|
ц ц |
г |
,, 1р'р . П ,,a |
имт, ,, |
йз |
г |
,, 1р'р |
a , , |
1р'р . НV |
|
|
|||
д о )к й " |
|
|
a , , к |
|
|
Интерфейс IRobozillaSafe наследует интерфейс I Pet. Таким образом, что бы реализация IRobozillaSafe была полной, классы, реализующие этот ин терфейс, должны реализовывать и интерфейс I Pet. Такое наследование - со всем не то же, что и наследование классов. Например, показанный выше класс PetRobo может иметь конструктор, но аналога конструктора базового класса для IRobozillaSafe или I Pet не существует. Интерфейсы не имеют конструк торов. Что еще более важно, полиморфизм с интерфейсами не работает. В то время как вы можете вызвать метод подкласса посредством ссылки на базовый класс (полиморфизм классов), подобная операция с интерфейсами не работа ет: вы не можете вызвать метод производного интерфейса (IRobozillaSafe) посредством ссылки на базовый интерфейс (IPet).
Хотя наследование интерфейсов не полиморфно в том смысле, в котором полиморфно наследование классов, вы можете передать объект интерфейса производного типа (IRobozillaSafe) в качестве параметра с типом базового интерфейса (I Pet). Это также означает возможность размещения объектов
IRobozillaSafe в коллекции объектов IPet.
i л i, ЧАСТЬ 2 |
B Ь(.1B( Ь1.(Г0 |
(B .( .0ВВ 1.(Г0 1B |
0 |

Использование интерфейсов для внесения изменений в объектно ориентированные программы
s1;1,.п,uQg c.,aQ1;1бС_ |
nД1;1Q,r,u |
З_Д |
З ,r , |
s, ,.,s1;1.,Сбss,рr |
д., |
||||||
.брр |
.,СбsДт З,1;1,.gu |
,r,Qc, |
Сб,1;1 |
|
rЗ,Q1;1 |
c. |
р,s,snфС c., |
.б рр, |
|||
Qc,_ |
,Сбs, s1;1,.п,uQ,С |
c, |
С,_ n,1;1 Сбрc.,Q1;1, |
.бQQр,n1;1 QnС _и, |
s,Сgр |
||||||
1;1.,r,Сбsnр |
З c., .бр р, |
|
|
|
|
|
|
|
|
||
|
/Е |
ЕВ ЕТОЧЕТВАBАПЕO<! iЧЕТO<! |
Ч |
ЕВЕЧЕТВeОЕАЕТЧЕЕТBox>О1ВЧ ПВСВВЧВЕТВ |
|||||||
|
ЕОДB3 ПСО1СЧЕЕB ПОПO<! |
ОДЧЕТВПНЕСОЕЧДАeОСВЕЧ/ЧЕЧ3ЕТЕТСВЕТОДЧЕТO< |
|||||||||
ЗАПОМНИ! |
ДЕВАВЕЧНЕТВХЧПЧ ЧЕ |
ХЧ |
ЕВЕВЕЧИЕТ ,О!ЧПBИАЕТЧВОЕТЧДB |
O<!ЕОДЕТВB3 |
|||||||
ДО ЕО!ЕОАЕТO<!oiЧПО |
ИАЕТЧЧАПСЧДO<!TЕТВОtxЧЕТeBox /ПСО1СЧЕ |
||||||||||
|
|||||||||||
|
ЕВ eОЕeBСВЕЕТЧ B |
BDccv'BcЧЕВВЕТДО |
ЕО!ЕОАЕТO<!СЕТЧeПО/ВЕB ВВЕВ |
||||||||
|
ЧЕВВЕТ B B D Чr ДЧtxВИПСО1СЧЕЕЕxo jЕО1ЧВ |
ПСО1СЧЕЕЕ ВОП1ОДВPЗ |
ЕЕЕТЕАНPЧПСО1СЧЕЕ ДОАОЕТВЕЕОАЕТЧЕЧПЧАЧЕЕЕХЕЧ cB cDЧПЧ
BBАПB!СЧЕТПО, -ПВЕТСn- Ч ЕТОЧ ЕТОПO<!i,ВЕТСЧ TЕТОЕОЕЧCОВДВС1ЧЗ
ПЧАO<!ЕЕО!ВАЕТДЧB ЕВЕВЕЧТЕХTЕТЧ1ОВЕl cЕТОCС ВЧВЕТППЧЕЧСОДЧЕЧ3
Ч ПСОВeЕТЧСОДЧЕЧА3B/ВЕТОЕТBВBoЧХЧ ЕВЕВЕЧТЕХЕЧЧДЕАtxЧИПСЧО): СЧЕТВЕТl
/ОЕТЕВЕТОПO<!iОИПСЧЕВСl,СВВПОПО!ЧЕ PЕТОДЧВСЧСХЧЧeПЧААОД0ЕaЕ! О ВeЗ ЕТЕПОВeПЧААОДЕОkBЕТПВСВЕВoЧЕТO<!ЕТВЕАНЧПЧЧЕЕЕ АПОАОЕТОЕ0 a ЕМВ! eСЧВВЕТАНi
0ЕaЕ |
НCCЕТОВ CЧВЕТ0 aiЕ МСВЧОПОP ВЕТ!ВЧЕi Ч АПОАОЕТОДСВЧПЧ |
ЧcЧЧСЧ ПЧ/ЕЕХ |
|
СВ!ЧЕОД ПВСВЕВoВЕЧН ЧПe3/ЧВЕТАНДЧАПОПO<! |
ОДЧЕЧЧЕЧАПВВОДЧЕЧНЧЕВВЕТАН |
||
ЕТЧ |
ОДЕИeПЧАА0ЕaЕ! Ч ЧЕТАЕТСЧeЕТЕЕИЕВЕТОВ2ЕВОТ ЕlЧЕТВЕ9 eЧ!В |
ИПОВeПЧААПВ): |
|
СВeСЕДЧВЕВЕТОВЕТЕВО ТПОЕ ТuТСЧЕ Х ЕОЕВ1BО СВЧП |
BН |
|
АТ
c T c T
АТ
1 |
Б a |
1 |
t |
a |
АТ
1 a
t
ГЛАВА 1 8 Интерфейсы оячt