Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 66

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 60 61 62 63 64 65 < 66 > 67 68 69 70 71 72 .. 320 >> Следующая

специальный открытый интерфейс для этой цели. Обратите внимание, что пользователь объекта Саг и не узнает, что тот передает обращения какому-то внутреннему объекту:
// Внутренний класс Radio инкапсулирован внешним классов Саг Саг viper - newCarO;
viper.TurnOnRadio(false); // Вызов будет передан внутреннему объекту Radio
Полиморфизм: классический и для конкретного случая
Последний, третий столп объектно-ориентированного программирования - это полиморфизм. Можно сказать, что этот термин определяет возможности, заложенные в языке, по интерпретации связанных объектов одинаковым образом. Существует две основные разновидности полиморфизма: классический полиморфизм
и полиморфизм «для конкретного случая» (ad hoc). Классический полиморфизм встречается только в тех языках, которые поддерживают классическое наследование (в том числе, конечно, и в С#), При классическом полиморфизме вы можете
148 Глава 3 • С# и объектно-ориентированное программирование
определить в базовом классе набор членов, которые могут быть замещены в производном классе. При замещении в производных классах членов базового класса эти производные классы будут по-разному реагировать на одни и те же обращения.
Для примера мы вновь обратимся к нашей иерархии геометрических фигур. Предположим, что в классе Shape (геометрическая фигура) определена функция Draw() — рисование, которая не принимает параметров и ничего не возвращает.
Поскольку геометрические фигуры бывают разными и каждый тип фигуры потребуется изображать своим собственным уникальным способом, скорее всего, нам потребуется в лроизводкыхклассах(таких как Hexagon - шестиугольники Ci rel е -окружность) создать свой собственный метод Draw(), заместив им метод DrawC) базового класса (рис. 3.5).
Object
vokl Draw()
Shape
Hexagon
Draw{
Circle
Draw(
43
Рис. 3.5. Классический полиморфизм
Классический полиморфизм позволяет определять возможности всех производных классов при создании базового класса. Например, в нашем примере вы можете быть уверены, что метод Draw() в том или ином варианте присутствует в любом классе, производном от Shape. К достоинствам классического полиморфизма можно отнести также и го, что во многих ситуациях вы сможете избежать создания повторяющихся методов для выполнения схожих операций (типа DrawCircle(), DrawRectangleC), DrawHexagon() и т. д.).
Вторая разновидность полиморфизма — полиморфизм для конкретного случая (ad hoc polymorphism). Этот тип полиморфизма позволяет обращаться схожим образом к объектам, не связанным классическим наследованием. Достигается это очень просто: в каждом из таких объектов должен быть метод с одинаковой сигнатурой (то есть одинаковым именем метода, принимаемыми параметрами и типом возвращаемого значения. В языках, поддерживающих полиморфизм этого типа, применяется технология «позднего связывания» (late binding), когда тип объекта, к которому происходит обращение, становится ясен только в процессе выполнения программы. В зависимости от того, к какому типу мы обращаемся, вызывается нужный метод. В качестве примера рассмотрим схему на рис. 3.6.
Обратите внимание, что общего предка - базового класса для CCircle, CHexagon и CRectangl е не существует. Однако в каждом классе предусмотрен метод Draw() с
одинаковой сигнатурой. Для того чтобы продемонстрировать применение полиморфизма этого типа в реальном коде, мы воспользуемся примером на Visual Basic 6.0. До изобретения VB.NET Visual Basic не поддерживал классический полиморфизм (так же, как и классическое наследование), заставляя разработчиков
сосредоточивать свои усилия на полиморфизме ad hoc.
Средства инкапсуляции в С# 149
CCircle
CHexagon
CRectangle
Draw()
Draw()
о
6
Draw()
Рис. З.6. Полиморфизм для конкретного случая
' Это - код на Visual Basic 6.0!
" Вначале создадим нассив элементов типа Object и установим для каждого элемента
ссылку на объект
Dim objArr(3) as Object
Set obJAri-(0) = New CCircle
Set objArr(l) = New CHexagon Set objArr(2) = New CCircle
Set objArr(3) = New CRectangle
' Теперь с помощью цикла заставим какдый элемент нарисовать самого себя Dim і as Integer For і = 0 to З
objArr(i).Draw 'Позднее связывание
Next 1
В этом мы вначале создали массив типа Object (это
тип данных Visual Basic 6.0 для хранения ссылок на любые объекты, не имеющий ничего общего с классом System.ObjectB .NET). Затем мы связали каждый элемент массива с объектом соответствующего типа, а потом при помощи цикла воспользовались методом DrawO для каждого из этих объектов. Обратите внимание, что у геометрических фигур — элементов массива — нет общего базового класса с реализацией метода Draw() по умолчанию.
Теоретический обзор главных принципов полиморфизма - инкапсуляции, наследования и полиморфизма на этом закончен. Конечно же, в С# реализованы все эти принципы, при этом С# поддерживает и отношения «быть» и отношения «иметь* для повторного использования кода, и обе разновидности полиморфизма. Теперь наша задача — узнать, как реализуется каждый из этих принципов средствами синтаксиса С#.
Предыдущая << 1 .. 60 61 62 63 64 65 < 66 > 67 68 69 70 71 72 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100