Сущность полиморфизма (polymorphism) заключается в том, что разные объекты могут иметь различные реализации одной и той же характеристики. В качестве примера рассмотрим два объекта, один из которых является автомобилем Porsche 911, а Другой — Toyota Corolla. Оба объекта — автомобили; т.е. оба происходят из класса Саг и содержат метод d r i v e . Но реализации методов, как видите, могут разительно отличаться друг от друга.
Судя по описанию, полиморфизм подобен инкапсуляции, но в то же время имеет некоторые существенные отличия. Инкапсуляция выражается в сокрытии внутренней реализации объекта. Полиморфизм, в свою очередь, проявляется в том, что различные классы могут иметь один и тот же интерфейс.
В Visual Basic 4.0 была реализована достаточно ограниченная поддержка полиморфизма, осуществленная с помощью динамического связывания. Динамическое или позднее связывание (late binding) представляет собой определенную технологию, позволяющую определять во время выполнения кода, какие свойства и методы обеспечивает данный объект. При этом код может создавать какой-либо объект и вызывать его методы или свойства независимо от того, поддерживается ли объектом вызываемый метод во время компиляции. Если использовать два различных класса с одинаковыми свойствами и методами, то создавать отдельные экземпляры этого класса можно с помощью переменной типа object.
К сожалению, динамическое связывание не позволяет должным образом обеспечить безопасность типов во время компиляции. Концепция безопасности типов (type safety) гарантирует использование типов данных, соответствующих своему названию, например строковых для строк и т.д. При отсутствии механизма безопасности типов значительно возрастает количество потенциальных ошибок, возникающих при выполнении программы до завершения ее компиляции. Кроме этого, безопасность типов позволяет предотвратить взлом программ, используя некорректный фрагмент кода.
В Visual Basic 5.0 появилась дополнительная форма полиморфизма, позволяющая использовать интерфейсы. Интерфейс (interface) определяет набор свойств, методов и событий, реализуемых данным классом. Один и тот же интерфейс может быть реализован одновременно несколькими классами. Переменная, определяющая значение интерфейса, может ссылаться на любой класс, реализующий данный интерфейс.
Интерфейсы обеспечивают раннее связывание с объектом, что позволяет значительно повысить эффективность, а также обеспечить защиту типов во время компиляции. Интерфейсы являются одной из наиболее важных особенностей Visual Basic 5.0, правда, все еще наименее изученной и мало используемой.
В VB.NET существенно улучшена поддержка интерфейсов. В настоящее время язык имеет прямую поддержку создания интерфейсов, что в более ранних версиях осуществлялось либо с помощью языка описания интерфейсов (IDL), либо путем создания пустых классов. Кроме того, какой-либо один метод может быть реализацией методов сразу нескольких интерфейсов. Приведен пример полиморфизма, реализованного с помощью динамического (или позднего) связывания, с помощью раннего связывания. В том и другом примере показаны классы, реализующие методы Ride. Как видите, в обоих случаях метод может вызывать метод любого класса независимо от того, каким из объектов он используется. Именно в этом и состоит сущность полиморфизма: создания кода, который использует различные объекты, реализующие один и тот же интерфейс.
Полиморфизм, реализованный с помощью позднего связывания
Public Class RollerCoaster Public Sub Ride() Console.WriteLine("Here we go") Console.WriteLine("Click, Click ,Click") Console .WriteLine ("Oh, *&@&#%") Console.WriteLine ( "That was great") End Sub End Class Public Class MerryGoRound Public Sub RideO Console.WriteLine("OK will go on it") Console.Writeline("Nap Time") Console.WriteLine("Yea its over") End Sub End Class
Приведенный ниже код расположен в программе.
Private Sub DayAtTheAmusementPark() Dim oRollerCoaster as New RollerCoaster Dim oMerryGoRound as New MerryGoRound Call GoOnRide(oRollerCoaster) Call GoOnRide(oMerryGoRound) End Sub
Private Sub GoOnRide(oRide as Object) oRide.RideO End Sub
В данном случае предпочтительнее использовать раннее связывание, так как оно спо- собствует повышению эффективности и позволяет находить ошибки, возникающие во время компиляции. Раннее связывание может быть реализовано с помощью интерфей- сов, как показано.
Полиморфизм, реализованный с помощью интерфейсов
Public Interface IAmusementParkRide Sub Ride() End Interface Public Class RollerCoaster Implements IAmusementParkRide Public Sub IAmusementParkRide_Ride() Console.WriteLine("Here we go") Console.WriteLine("Click, Click .Click") Console.WriteLine("Oh, *&@&#%") Console.WriteLine("That was great") End Sub End Class Public Class MerryGoRound Implements IAmusementParkRide Public Sub IAmusementParkRide_Ride() Console.WriteLine("OK will go on it") Console.Writeline("Nap Time") Console.WriteLine("Yea its over") End Sub End Class
Следующий код находится где-то в программе:
Private Sub DayAtTheAmusementPark() Dim oRollerCoaster as New RollerCoaster Dim oMerryGoRound as New MerryGoRound Call GoOnRide(oRollerCoaster) Call GoOnRide(OMerryGoRound) End Sub Private Sub GoOnRide(oRide as IAmusementParkRide) oRide.Ride() End Sub