Иллюстрированный самоучитель по Visual Basic .NET

Полиморфизм на практике

Наследование часто помогает избавиться от громоздких конструкций 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.

Иллюстрированный самоучитель по Visual Basic .NET › Наследование и интерфейсы › Полиморфизм на практике
Рис. 5.2. Использование полиморфизма в программе

Примечание
Иногда говорят, что в VB.NET по умолчанию методы являются виртуальными. Термин "виртуальный" означает, что при вызове метода компилятор использует истинный тип объекта вместо типа контейнера или ссылки на объект
.

В только что рассмотренном примере под виртуальностью следует понимать, что, хотя все ссылки относятся к типу Employee (поскольку объекты хранятся в массиве Employee), компилятор проверяет истинный тип объекта sally (это тип Programmer) для вызова правильного метода RaiseSalагу, обеспечивающего большую прибавку.

Виртуальные методы довольно часто используются в ситуациях, когда в контейнере базового типа хранятся объекты как базового, так и производного типа. Впрочем, наш упрощенный подход к вызову виртуальных методов сопряжен с некоторыми опасностями. Модификация класса Programmer и включение в него уникальных членов нарушают нормальную работу полиморфизма.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.