Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 85

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 79 80 81 82 83 84 < 85 > 86 87 88 89 90 91 .. 404 >> Следующая


В UML наследование изображается с помощью стрелок (см. рис. справа).

Здесь для краткости опущены члены, обладающие возвращаемыми значениями.

При наследовании от одного базового класса возникает очень важный вопрос о режиме доступа к членам данного класса. Частные члены базового класса, в отличне от общих членов, доступны не будут. Однако общие члены будут доступны и внешнему коду. Это означает, что при использовании только этих двух режимов доступа мы не можем получить член, который был бы доступен базовому классу и производному классу, но не был бы прн этом доступен для внешнего кода.

Для решения этой проблемы вводится третий режим доступа — protected (защищенный), при котором доступ открыт только для производных классов. С точки зрения внешнего кода этот режим доступа идентичен режиму доступа к частному члену — ни к одному, инк другому доступа не имеется.

Кроме степени защиты данного члена мы можем определять его поведение прн наследовании. Члены базового класса могут описываться как virtual (виртуальный), что означает, что такой член может быть переопределен классом, который его наследует. Другими словами, производный класс может использовать альтернативную реализацию данного члена. Такая альтернативная реализация не отменяет

как производному классу, так
170

Глава 8

Animal

¦EatFoodQ

+Broed()

HH

Chlcktn Cow

¦CtucfcO ¦LayEggQ +M00O +SupptyMllk() +EatFoodO


оригинальный код, который по-прежнему остается доступным в рамках этого класса, однако он становится скрытым для внешнего кода. Если же никакой альтернативной реализации не используется, то внешний код обладает доступом к реализации данного члена в базовом классе.

Заметьте, что виртуальные члены не могут быть частными, поскольку это привело бы к парадоксу: нельзя одновременно утверждать, что член может быть переопределен производным классом и в то же время быть для него недоступным.

В примере с животными мы можем объявить метод EatFoodO виртуальным и использовать для него другую реализацию во всех производных классах, например, в классе cow (см. рис. слепа).

Здесь метод EatFoodO изображен как для класса Animal, так и для класса cow с той целью, чтобы показать, что в каждом классе используется своя собственная реализация.

Базовые классы могут описываться как abstract (абстрактные). Абстрактный класс не допускает непосредственного создания экземпляра, Для того чтобы можно было им воспользоваться, он должен быть унаследован другим классом. У абстрактных классов могут иметься абстрактные члены, не имеющие никакой реализации, т. е. их реализация должна присутствовать в производном классе.

Если допустить, что класс Animal — абстрактный, то в UML он должен изображаться так, как показано на рисунке справа.

Имена абстрактных классов выводятся курсивом (или ниогда прямоугольник, в котором они находятся, ограничивается пунктирной линией).

Наконец, класс может быть описан как sealed (изолированный). Изолированный класс нельзя использовать в качестве базового класса, поэтому у него не может быть производных классов.

В C# существует общин базовый класс для всех объектов, называемый object (этот же класс в .NET Framework называется System.object). В следующей главе мы познакомимся с ним поближе.

Интерфейсы, описанные в этой главе, также могут наследоваться от других интерфейсов. Однако в отличие от классов интерфейсы могут наследоваться от нескольких базовых интерфейсов (таким же образом, как классы могут поддерживать по несколько интерфейсов).

Animal

I

¦EatFoodO

+Breed()

Chicken Cow

+CIik*Q ¦LayEgflO +EatFoodO ¦SreadQ +M00O ¦*SupplyMilk() + EatFoodO + BreedO

Полиморфизм

Одно из следствий использования иерархии наследования заключается в том, что методы и свойства, предоставляемые производными классами, перекрываются. По этой причине часто существует возможность применять объекты, являющиеся экземплярами классов, в качестве объектов базового типа и использовать для них общий идентичный синтаксис. Например, если базовый класс с именем Animal обладает методом EatFoodO, то синтаксис вызова этого метода нз производных классов cow и Chicken будет одинаковым:

Cow myCow = new Cow О ;

chicken my Chicken = new Chicken О ;

myCow.EatFoodO »

myChicken.EatFoodO ;
Введение в объектпо-ориептированное программирование

171

Полиморфизм позволяет пойти еще дальше. Существует возможность присвоить переменной базового типа переменную, которая имеет один из производных типов. Например:

Animal nyAnimal = myCow;

При этом не требуется никакого приведения типов. С помощью этой переменной мы получаем возможность обращаться к методам базового класса:

myAnimal.EatFood();

Это приведет к вызову метода EatFoodо, реализованного в производном классе. Обратите внимание, что не существует возможности вызывать аналогичным способом методы, определенные в производном классе. Следующий код работать не будет:

my Animal ,Моо();

Однако мы можем привести тип переменной базового типа к типу производного класса и после этого вызвать метод производного класса:
Предыдущая << 1 .. 79 80 81 82 83 84 < 85 > 86 87 88 89 90 91 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.