Как стать начальником? Просмотр иерархии наследования. Правила преобразования и обращения к членам классов в иерархии наследования.
Предположим, вы построили замечательную объектно-ориентированную систему учета кадров, в которой в полной мере используются все преимущества полиморфизма. А теперь попробуйте ответить на простой вопрос – как в вашей системе реализован перевод простого работника в менеджеры?
Как ни странно, в ООП подобные операции (то есть изменение типа текущего экземпляра в объектно-ориентированной программе) считаются одним из сложнейших аспектов архитектуры приложения, о котором обычно никто всерьез не думает, пока ситуация не станет критической. В соответствии со спецификой объектно-ориентированного программирования после создания объекта изменить его тип невозможно.
В нашей системе учета кадров существует только одно приемлемое решение – включить в класс Employee метод, который копирует состояние Employee в новый объект Manager, после чего помечает старый объект Employee как неиспользуемый.
Просмотр иерархии наследования
С усложнением иерархии классов в программе на помощь приходит окно классов и Object Browser. Например, из окна классов на рис. 5.1 видно, что класс Programmer является производным от класса Employee и переопределяет только конструктор и метод RaiseSalary.
Рис. 5.1. Иерархия наследования в окне классов
Примечание
Программы, основанные на UML (в частности, Visio или Rational Rose), не только отображают связи между классами в иерархии наследования, но и генерируют "скелет" программы. Одни программисты в восторге от систем автоматизированного программирования, другие их ненавидят.
Правила преобразования и обращения к членам классов в иерархии наследования
Объекты производных классов могут храниться в переменных базовых классов:
Dim tom As New Programmer("Tom". 65000) Dim employeeOfTheMonth As Employee employeeOfTheMonth = torn
В режиме жесткой проверки типов (Option Strict On), если объект tom хранится в переменной employeeOfTheMonth, для сохранения его в переменной Programmer приходится использовать функцию СType, поскольку компилятор заранее не знает, что такое преобразование возможно:
Dim programrnerOnCall As Programmer programmerOnCal1 = CType(employeeOfTheMonth,Programmer)
Конечно, простое сохранение tom в переменной programmerOnCall выполняется простым присваиванием.
Примечание
При работе с объектом torn через переменную employeeOfTheMonth вам не удастся использовать уникальные члены, определенные в классе Programmer и отсутствующие в Employee. С другой стороны, как будет показано в следующем разделе, при этом сохраняется доступ ко всем членам класса Programmer, переопределяющим члены класса Employee.