
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .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
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

Если бы С# не поддерживал позднее связыван ие, то вам бы пришлось ре дактировать метод someMethod ( ) , чтобы проверять в нем, является ли пере данный объект s переменной типа Student или GraduateStudent. Программа должна была бы вызывать Student . CalcTuition ( ) в случае, когда переменная s принадлежала бы классу Student, и GraduateStudent . CalcTuition ( ) для класса GraduateStudent.
Это было бы не так страшно, если бы не две проблемы.
> . Это только один метод. А теперь представьте, что CalcTuition ( ) вызывается в сотнях мест. . .
»Предположим, что CalcTuition ( ) - не единственное различие между двумя классами. Шансы, что вы найдете все места в програм ме, требующие изменений, резко снижаются. . .
При использовании полиморфизма вы просто позволяете С# самостоятель но решить, какой метод должен быть вызван.
Использование is для полиморфного доступа к скрытому методу
Каким образом сделать программу полиморфной? Один из подходов для решения этой задачи в С# состоит в использовании ключевого слова is (о кото ром (и его родственнике as) рассказывалось в главе 16, "Наследование"). Вы ражение Ьа is SavingsAccount возвращает значение true или false в зависи мости от класса объекта во время выполнения программы. Объявленный тип может быть BankAccount, но с какого типа объектом приходится иметь дело в реальности? В приведенном далее фрагменте исходного текста is использует ся для обращения к методу Withdraw ( ) класса SavingsAccount.
т |
r:) |
(rnш |
,хр1 |
хшг |
|
|
|
|
|
|
|
уt |
т |
:( |
:(ш |
|
;,р |
"шm,w e: |
3,хш |
шy nгошимmw))р им : ,,(fОгшr шгр им C |
|
||
|
|
|
|||||||||
|
|
: - |
,' ш ; |
6ш |
: |
1w()р |
им , |
|
|
|
|
|
|
уt |
6ш им: 1 |
w))р им |
шe |
n 6ш |
: 1 w()р |
, ' ш V |
|
||
|
|
|
|
||||||||
|
|
|
"шe; |
|
3,хш ,шгр |
имC W |
|
|
|
||
|
|
,r |
, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ГЛАВА 1 7 ре Кс теипсвт, |
387 |

НО'ННЕЕМЗВЕО!ИВ ПССО!ИМВВ ПСКОПО!ИОЗ ЗВНОПОЗ
" " " " |
K |
K |
"" |
K |
ТЕХНИЧЕСКИЕ |
|
|
|
|
ЗАЗДИЗСКЗРТ |
|
|
|
|
\ВОВ ЗСОЗОЗКИНЗВОПЗВНИКИНИВЗKСНО'ННЕЕНТi ИНСМЗНИИСТОССВИСЕМ ННКП ННЗОВКИМПНЕМПОВОНСИИИИНПМ!KВППО!МВВВИПЗВНЗО!ВТИг КИИЕИЕ!ИОd ОВKПС
ЕО!ИВИ МЗСО!ВКОПНВВВОВ. |
СО!ТО! ОИСНМПО!МВП ЕИИИИЕ!ОЗОКИМВНИЕОЕЕМЗТО! |
|
ИОЕЕ ВИПЗВЕiЗООВПИВЗВПИИИОb П ЗО!ВТИЕЕ |
!МКИИЗВПЕ ОТМЗОПП СНО'ННЕЕИd |
О!ТО! З МЗСО!ВКОПНИМИЕИП ПСО!ИИ ННЗОВОЗСОЗОЗИИО.ВО С!ОТНK М!ИKd НМЕИИИИМИИПВНИЗЕИВОВЕИВО!Н СИe!Е\И НИЕЗИЕТИЗ ДОЗПИ!ОЕ!ИИИОЗВМОПЗИТ ПОКЕО!ИСТ ВМСНТЗКИИВОППОВОНСИМЕИРВЗK -М ЕО'ЕВ СОKПМВВЗKП !Н!ВИИЗm ТИЕ!1 П ЗНИПИ \ВО ИНП!Н! СПНИВИНЕИВО! СИeОЕ\Е!НИЕЗИЕТИ З 'ЗТМТПОЕХ! ЗО!Вe
ТЕР ОВПИВЗВПИИИОЗВВТЕХFSТSЗИЗКИНЗi ПНТИСНМ!О!ИИМИОЗТО!МВЗK!ПЕЕK П!НЗЗНЕМ ИО КНПВННОВ ПНЗЕО'ЕВ СОВНИЗОПНВВНИН!МКОПНВВИОПСЗ ПМ! ЗКИИВНИНСНМЕИН. КИОЗАeНСЕЗАЗАМИ!ННМПС ЗЕ!ИВИ ПСИЕ!!ИИС СИНИНСВВПЗР СНО'ННЕЕЕ П СОМЗПНТ ЕИЗВi П ПОВОНСИИН!О ПИИЗВМ!ОЗНП!ИИМKiЗПKКНИСИ З СНОПИНПОЗВМСННН'ЕЕИИ ВНЕИВО!Н П СНОСИЗЗИПССО!ИИИМKСНО'ННЕЕС.
Объявление метода виртуальным и перекрытие
(. (-a!, |
-#a!.( |
P#V!1 э)6L --#ankA#F |
0-0 |
|
.!)#>)! |
)# |
F!a# .( |
20 |
.#.(a3 |
#Д! |
|||||||
!--#.!-.#))0- |
!2! |
--#F -!2-!6)0F |
a(.(F |
->#a!- |
!a#.!-3 |
20 |
.!,1> |
(a3 |
ga! |
||||||||
.,!Д,(-- (-a1 |
(-.!.3217e#-1 |
|
-#a!. P# V!1эomp,L --#ankA#F20ai#d2(-a(-(a3 |
lМa |
|||||||||||||
-(-!-a!уa#.3)! |
.,()(-(a3 |
,#ch#)(# |
! |
a!-я.(.!3 |
-#a!. |
.!.6#) |
|
20a3 -02-() |
|||||||||
!-)!-0-(у-3 |
)( |
() |
!,-(c(( |
! |
a(.# |
!2З#.a( |
-,#-#)( -0.!.)#)(у |
|
.,!Д,(-- 0i |
||||||||
!6)! 2(-a(-(a3 |
lМa -(-!-a!уa#.3)! |
|
.,()(-(a3 |
,#ch#)(# |
! |
-#,-(( |
|||||||||||
э) сL-rn#ankA20.!a!,17 |
-.#.1#a |
|
-02-(a3 |
|
с.1 |
ga!Д! )#!2F!.(-! |
.!-#a(a3 |
-#a!. |
|||||||||
2(2!-!Д! ..(--( |
.,( |
.!-!e( |
..7>#-!Д! |
|
-.!-( |
|
homp-,.#FT( .(6.17 |
|
-#,-(7 |
-#a! |
|||||||
.( - .!...(--(F |
|
..7>#-0- |
|
-.!-!- |
(h! --)- !a |
|
|
|
|
|
|
|
|||||
l.#.17e(3 |
|
.,(-#, !-)!-() |
|
)( |
.!.(-!, (2-#i |
th)#- - -#a!.0 э) ,L--#ankA20 |
|||||||||||
.!2(-.#)0 |
()-a,1.c(( |
-0-!.( |
|
>a!20 |
|
.!.(2(a3 |
>a! .#3- a-(a#.3)! |
|
-020-(7ai |
||||||||
-у .,(-(.3)0# |
|
-# |
!.0 th!a .!. |
.,!Д,(--0 |
th(F (-1 Lomp4L!-),#(4!в |
|
|
|
|||||||||
ЧАСТЬ 2 |
T |
y,W ## |
#),,#A, )#. ,# ##, |
C)#г),..,) |
#.,#,, |
|
С# |
|

=
G |
e |
= |
=
( *E
==TSG==T =HT ==T
=
=п= (n+=() + =
