ПОНЯТНО О Visual Basic NET (том 3)


Полиморфизм - часть 2


Public Class Участок_штакетник

    Inherits Участок

    Public Overrides

Function Площадь_забора() As Integer

        Return    0.5 * Периметр() * Высота_забора

    End Function

End Class

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

Однако мы привыкли, что при вызове методов наследника на самом деле вызываются родительские методы. В данной ситуации нам это не подойдет. Поэтому мы дописываем в заголовок функции наследника слово Overrides, что значит «пересиливает, переопределяет». Имеется в виду – пересиливает функцию родителя. С этой же целью мы дописываем в заголовок функции родителя слово Overridable, что значит «позволяет себя пересилить, переопределить»:

    Public Overridable

Function Площадь_забора() As Integer

        Return   Периметр() * Высота_забора

    End Function

Можете проверить все сказанное, использовав форму из 3 кнопок: одна создает обычный участок, другая – участок со штакетником, третья печатает расход краски на каждом участке.

MyBase и MyClass. Итак, у нас теперь две функции Площадь_забора, одна у родителя, другая – у наследника. Теперь, когда бы мы в коде наследника ни обратились к функции Площадь_забора, вызовется функция наследника, а не родителя. А если нам захочется обратиться из кода наследника именно к родительской функции? Вы спрашиваете, зачем это нужно? Вот конкретный пример. Замечаем, что площадь забора из штакетника вдвое меньше, чем у обычного. В связи с этим нам кажется проще вычислить площадь обычного забора, а затем поделить ее пополам. Переписываем функцию в классе Участок_штакетник:

    Public Overrides Function Площадь_забора() As Integer




Начало  Назад  Вперед