Программирование >>  Обработка исключительных ситуаций 

1 ... 56 57 58 [ 59 ] 60 61 62 ... 142


Глава 8

Иерархии классов

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

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

Классы, расположенные ближе к началу иерархии, объединяют в себе общие черты для всех нижележащих классов. По мере продвижения вниз по иерархии классы приобретают все больше конкретных особенностей.

Итак, наследование применяется для следующих взаимосвязанных целей:

исключения из программы повторяющихся фрагментов кода;

упрощения модификации программы;

упрощения создания новых программ на основе существующих.

Кроме того, наследование является единственной возможностью использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения.

Наследование

Класс в С# может иметь произвольное количество потомков и только одного предка. При описании класса имя его предка записывается в заголовке класса



class Daemon Monster public Daemon О brain = 1:

public Daemon( string name, int brain ) : base( name ) 1

this.brain = brain;

public Daemon( int health, int ammo, string name, int brain )

: base( health, ammo, name ) 2

this.brain = brain;

new public void PassportO 3

продолжение

после двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System.Object:

[ атрибуты ] [ спецификаторы ] class имякласса [ : предки ] тело класса

ПРИМЕЧАНИЕ-

Обратите внимание на то, что слово предки присутствует в описании класса во множественном числе, хотя класс может иметь только одного предка. Причина в том, что класс наряду с единственным предком может наследовать от интерфейсов - специального вида классов, не имеющих реализации. Интерфейсы рассматриваются в следующей главе.

Рассмотрим наследование классов на примере. В разделе Свойства (см. с. 120) был описан класс Monster, моделирующий персонаж компьютерной игры. Допустим, нам требуется ввести в игру еще один тип персонажей, который должен обладать свойствами объекта Monster, а кроме того уметь думать. Будет логично сделать новый объект потомком объекта Monster (листинг 8.1).

Листинг 8.1 . Класс Daemon, потомок класса Monster using System;

namespace ConsoleApplicationi class Monster



class Classl

{ static void MainO

Daemon Dima = new Daemon( Dima , 3 ) 5

Dima. Passport () ; 6

Dima.ThinkO; 7

Dima.Health -= 10; 8

Dima.PassportO;

В классе Daemon введены закрытое поле brain и метод Think, определены собственные конструкторы, а также переопределен метод Passport. Все поля и свойства класса Monster наследуются в классе Daemon1.

Результат работы программы:

Daemon Dima health = 100 ammo = 100 brain = 3

Dima is thinking thinking thinking...

Daemon Dima health = 90 ammo = 100 brain = 3

Как видите, экземпляр класса Daemon с одинаковой легкостью использует как собственные (операторы 5-7), так и унаследованные (оператор 8) элементы класса. Рассмотрим общие правила наследования, используя в качестве примера листинг 8.1.

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

1 Если бы в классе Monster были описаны методы, не переопределенные в Danon, они бы также были унаследованы.

Листинг 8.1 (продолжение) {

Console.WriteLineC

Daemon {0} \t health = {1} ammo = {2} brain = {3} . Name, Health, Ammo, brain ):

public void ThinkO 4

Console.Write( Name + is ) ;

for ( int i = 0; i < brain; ++i ) Console.WriteC thinking ); Console.WriteLine( );

int brain; закрытое поле



1 ... 56 57 58 [ 59 ] 60 61 62 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика