|
Программирование >> Дополнительные возможности наследования
КЗУПШ Strlng(char*) constructor String(char*) constructor Strlng(char*) constructor Strlng(char*) constructor String destructor Strlng(char*) constructor Constructor count; 5 Name: Edythe Levine Address; 1461 Shore Parkway Salary: 20000 Constructor count: 5 Strlng(Strlno&) constructor String(String&) constructor Strlng(String&) constructor Name: Edythe Levine, Address: 1461 Shore Parkway. Salary; 20000 String destructor String destructor String destructor Constructor count: 8 String destructor String destructor String destructor String destructor Как видно по данным, выводимым профаммой, в процессе создания одного объекта Employee создается пять объектов класса String. Когда объект Employee передается в функцию rPrintFuncO как ссылка, дополнительные объекты Employee не создаются. Соответственно не создаются и дополнительные объекты String. (Все они, кстати, также автоматически передаются как ссылки.) Когда объект Employee передается в функцию PrintFuncO как значение, создается копия объекта Employee вместе с тремя объектами класса String (для этого используется конструктор-копировщик). Различные пути передачи функциональности классу в некоторых случаях одному классу необходимо передать некоторые свойства другого. Предположим, например, что вам необходимо создать класс каталога деталей PartsCatalog. На основе класса PartsCatalog предполагается создать коллекцию объектов, представляющую различные запчасти с уникальными номерами. В базе данных на основе класса PartsCatalog запрещается дублирование объектов, а для доступа к объекту необходимо указать его идентификационный номер. Ранее, в обзоре за вторую неделю, уже был объявлен и детально проанализирован класс PartsList. Чтобы не начинать работу с нуля, можно взять этот класс за основу при объявлении класса PartsCatalog. Для этого можно вложить класс PartsList в класс PartsCatalog, чтобы затем делегировать классу PartsCatalog ответственность за поддержание связанного списка в класс PartsList. Существует альтернативный путь. Можно произвести класс PartsCatalog от класса PartsList, таким образом унаследовав все свойства последнего. Помните однако, что открытое наследование (со спецификатором public) предполагает логическую принадлежность производного класса более общему базовому классу. Действительно ли в нащем случае класс PartsCatalog является частным проявлением класса PartList? Чтобы разобраться в этом, попробуйте ответить на ряд вопросов. 1. Содержит ли базовый класс PartsList методы, не применимые в классе PartsCatalog? Если да, то, вероятно, от открытого наследования лучще отказаться. 2. Будет ли один объект класса PartsCatalog соответствовать одному объекту класса PartsList? Если для создания объекта требуется не менее двух объектов PartsList, то, безусловно, необходимо применять вложение. 3. Обеспечит ли наследование от базового класса преимущества в работе благодаря использованию виртуальных функций или методов доступа к защищенным членам базового класса? В случае положительного ответа имеет смысл воспользоваться открытым или закрытым наследованием. Ответив на приведенные выще вопросы, вы должны принять рещение, использовать ли вам в профамме открытое наследование, закрытое наследование (см. далее в этом занятии) или вложение. Познакомимся с некоторыми терминами, которые потребуются нам при дальнейщем обсуждении этой темы. Вложение - объект, относящийся к другому классу, используется в текущий класс. Делегирование - передача ответственности за выполнение специальных функций вложенному классу. Выполнение средствами класса - реализация специальных функций в классе за счет другого класса без использования открытого наследования. Делегирование Почему же класс PartsCatalog нельзя произвести от PartsList? Дело в том, что класс PartsCatalog должен обладать соверщенно иными свойствами и его невозможно представить как частную реализацию класса PartsList. Посмотрите, класс PartsList - это коллекция объектов, упорядоченная по возрастанию номеров, элементы которой могут повторяться. Класс PartsCatalog представляет неупорядоченную коллекцию уникальных объектов. Конечно, при желании можно произвести класс PartsList от класса PartsList со спецификатором public, после чего соответствующим образом заместить функцию Insert О и оператор индексирования ([]). Однако такие действия крайне нелогичны и противоречат самой сути наследования. Вместо этого следует создать новый класс PartsCatalog, в котором нет оператора индексирования, не разрешается дублирование записей и перефужается operator+ для суммирования наборов записей. Функцию управления связанным списком оставим классу PartsList. Попробуем сначала решить эту задачу путем вложения одного класса в другой с делегированием ответственности от класса классу, как показано в листинге 15.5. Листинг 15.5. Делегирование втветственнвстн классу PartsList, включеннвму в класс PartsCatalog 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 (tinclude <iostream.h> ................ Класс Part Абстрактный базовый класс всех деталей class Part public; Part():itsPartNumber(1) { } Part(int PartNumber); itsPartNumber(PartNufiiber){ } virtual Part(){ } int GetPartNumberO const { return itsPartNumber; } virtual void DisplayO const =0; private: int ItsPartNumber; выполнение чистой виртуальной функции в стандартном виде для всех производных классов void Part;;Display() const cout л nPart Number; itsPartNumber endl; } .......*.*. Автомобильные детали ******* class CarPart ; public Part { public; CarPartO ;itsModelYear(94){ } CarPart(int year, int partNumber); virtual void DisplayO const { Part;;Display(); cout << Model Year; ; cout itsModelYear endl; private; int ItsModelYear; } ; CarPart;;CarPart(int year, int partNumber): itsModelYear(year), Part(partNumber) { }
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |