|
Программирование >> Обработка исключительных ситуаций
Глава 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; закрытое поле
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |