Объектно-ориентированные технологии проектирования прикладных программных систем


Реализация наследования


В языке Eiffel список наследования помещается вслед за ключевым словом inherit:

class ITEM export cut, move, pick, ungroup feature cut is deferred end; move (deltax, deltay: REAL) is deferred end; pick (x, y: REAL): BOOLEAN is deferred end; ungroup () is deferred end class SHAPE export cut, draw, erase, move, pick, ungroup, write inherit ITEM feature * x, y: REAL; cut is <body> end; draw is <body> end; erase is <body> end; move (deltax, deltay: REAL) is <body> end; pick (x, y: REAL): BOOLEAN is <body> end; ungroup is <body> end; write (acolor: COLOR) is deferred end; end classrBOX export pick, write inherit SHAPE redefine pick, write feature width, height: REAL; Create (x0, y0, width0, height0:*REAL) is <body> end; pick (x, y: REAL): BOOLEAN is <body> end; write (acolor: COLOR) is <body> end end class CIRCLE export pick, write inherit SHAPE redefine pick, write feature radius: REAL; Create (x0, y0, radius0: REAL) is <body> end; pick (x, y: REAL): BOOLEAN is <body> end; write (acolor: COLOR) is <body> end end

Для обозначения абстрактных операций используется ключевое слово deferred; такие операции должны быть реализованы во всех подклассах. Переопределение свойств класса в подклассе отмечается в разделе redefine.

В языке Smalltalk описание класса Item, его подкласса Shape, а также подклассов Box и Circle класса Shape может иметь следующий вид:

class name Item superclass Object   class name Shape superclass Item instance variables x y instance methods cut draw erase move: aPoint ungroup   class name Box superclass Shape instance variables width height instance methods pick: aPoint write: aColor class methods createAt: aPoint width: widthSize length: lengthSize   class name Circle superclass Shape instance variables radius instance methods pick: aPoint write: aColor class methods createAt: aPoint radius: radiusSize

Все атрибуты суперкласса доступны всем его потомкам. Все методы могут быть переопределены в подклассах. Множественное наследование не поддерживается.

| |

Comments:

Copyright ©


Наследование в языке C реализуются через указатели. Рассмотрим, например, конкретные подклассы Box и Circle абстрактного класса Shape. На языке C их можно представить следующим образом:

struct Shape { struct ShapeClass* class; Length x; Length y; }; struct Box { struct BoxClass* class; Length x; Length y; Length width; Length height; }; struct Circle { struct CircleClass* class; Length x; Length y; Length radius; };

Указатель на структуры Box или Circle можно передать функции, ожидающей указатель на Shape, так как первые несколько членов структур Box и Circle идентичны первым членам структуры Shape (это позволяет привести тип указателя на структуру Box или Circle привести к типу указателя на структуру Shape).

| |

Comments:

Copyright ©



Содержание раздела