Полиморфизм
В традиционной трактовке термин "полиморфизм" (от греческого "много форм") означает, что объекты производных классов выбирают используемую версию метода в зависимости от своего положения в иерархии наследования. Например, и в базовом классе Employee, и в производном классе Manager присутствует метод для повышения зарплаты работника. Тем не менее метод RaiseSalаrу для объектов класса Manager работает не так, как одноименный метод базового объекта Employee.
Классическое проявление полиморфизма при работе с классом Manager, производным от Employee, заключается в том, что при вызове метода по ссылке на Employee будет автоматически выбрана нужная версия метода (базового или производного класса). Допустим, в программе метод RaiseSalary вызывается по ссылке на Employee.
- Если ссылка на Employee в действительности относится к объекту Manager, будет вызван метод RalseSalary класса Manager.
- В противном случае вызывается стандартный метод RaiseSalary базового класса.
Примечание
В VB5 и VB6 смысл термина "полиморфизм" был расширен, и к традиционному полиморфизму на базе наследования добавился полиморфизм на базе интерфейсов (объект, реализующий интерфейс, вызывал метод интерфейса вместо другого метода с тем же именем). Объект, реализующий интерфейс Manager, правильно выберет метод RaiseSalary в зависимости от контекста использования.
В обоих случаях объект выбирает метод в зависимости от полученного сообщения. При отправке сообщения не нужно знать, к какому классу фактически принадлежит объект; достаточно разослать сообщение всем объектам Employee и поручить выбор полиморфного метода компилятору.
Следующий пример показывает, почему полиморфизму придается такое большое значение. Одному из авторов доводилось консультировать компанию, занимавшуюся компьютерной обработкой медицинских анализов. Каждый раз, когда в процесс тестирования включался новый реактив, программистам приходилось просматривать многие тысячи строк кода, искать команды Select Case и добавлять в них секции Case для нового реактива. Стоило пропустить хотя бы одну… и нам бы не хотелось, чтобы этот реактив испытывался на наших анализах крови. Конечно, исправление многих команд Select Case превращало сопровождение в настоящий кошмар, требующий долгих часов тестирования.
Полиморфизм позволяет написать программу, которая в подобной ситуации ограничивается единственным изменением. Все, что от вас потребуется, – определить для нового реактива новый класс и правильно запрограммировать в нем переопределяемые или добавленные методы.
Почему? Потому что в главной программе можно будет использовать конструкции следующего вида:
For Each reagent in Reagents reagent.Method Next
Показанный цикл будет автоматически работать с новым реактивом, а необходимость в долгих поисках Select Case отпадет.
Select Case reagent Case iodine ' Действия с йодом Case benzene ' Действия с бензолом ' И т. д. для 100 разных случаев в 100 местах
В приведенном выше фрагменте цикл For Each перебирает все возможные реактивы, и благодаря волшебному свойству полиморфизма компилятор найдет метод, который должен вызываться для каждого конкретного реактива. Правильное использование полиморфизма избавит вас от громоздких команд Select Case, выбирающих нужное действие в зависимости от типа объекта.