Полиморфизм на практике
Наследование часто помогает избавиться от громоздких конструкций Select Case и If-Then-Else, чтобы вся черновая работа выполнялась компилятором и механизмом полиморфизма. Например, цикл из следующего фрагмента работает как с экземплярами класса Employee, так и с экземплярами Programmer:
Sub Maln() Dim tom As New Employee("Tom". 50000) Dim sally As New Programmer("Sally", 150000) Dim ourEmployees(l) As Employee ourEmpl.oyees(0)=tom ourEmployees(l)= Sally Dim anEmployee As Employee For Each anEmployee In ourEmployees anEmployee.RaiseSalary(0.1D) Console.WriteLine(anEmployee.TheName & "salary now is " & _ anEmployee.Salary()) Next Console. ReadLine() End Sub
Результат выполнения этого примера показан на рис. 5.2. Мы видим, что в каждом случае вызывается правильный метод RaiseSalary, несмотря на то что в массиве типа Employee хранятся как объекты Employee, так и объекты Programmers.
Рис. 5.2. Использование полиморфизма в программе
Примечание
Иногда говорят, что в VB.NET по умолчанию методы являются виртуальными. Термин "виртуальный" означает, что при вызове метода компилятор использует истинный тип объекта вместо типа контейнера или ссылки на объект.
В только что рассмотренном примере под виртуальностью следует понимать, что, хотя все ссылки относятся к типу Employee (поскольку объекты хранятся в массиве Employee), компилятор проверяет истинный тип объекта sally (это тип Programmer) для вызова правильного метода RaiseSalагу, обеспечивающего большую прибавку.
Виртуальные методы довольно часто используются в ситуациях, когда в контейнере базового типа хранятся объекты как базового, так и производного типа. Впрочем, наш упрощенный подход к вызову виртуальных методов сопряжен с некоторыми опасностями. Модификация класса Programmer и включение в него уникальных членов нарушают нормальную работу полиморфизма.