VB как объектно-ориентированный язык
Объектно-ориентированные средства VB5 и VB6 были, мягко говоря, ограниченными. В частности, эти версии VB не позволяли автоматически инициализировать данные класса при создании экземпляра. В результате объект создавался в неопределенном состоянии, что повышало вероятность ошибок и заставляло программиста принимать дополнительные меры предосторожности при работе с объектами. Для решения этой проблемы в VB.NET появились параметризованные конструкторы (см. главу 4).
Другим недостатком было отсутствие полноценного наследования (эта тема рассматривается в главе 5 [Наследование – штука полезная, но оно не является панацеей для написания объектно-ориентированных программ, как считают некоторые. Бесспорно, это важное, но не самое важное усовершенствование в VB.NET.]). Наследованием называется особая форма многократного использования кода, при которой программист определяет новые объекты на базе существующих объектов. Наследование очень хорошо подходит для таких задач, как создание нового текстового поля с расширенными возможностями на основании стандартного текстового поля. В VB версий 5 и 6 наследование не поддерживалось, поэтому для построения улучшенного текстового поля приходилось прибегать к услугам неудобной и ненадежной программы-мастера (wizard).
Рассмотрим другой пример, в котором было бы уместно наследование, – создание классов для работы со специализированными коллекциями. Чтобы создать коллекцию, специализировавшуюся на хранении строковых данных, в VB5 и 6 в класс включалось закрытое поле:
Private mCollection As Collection
В обработчиках событий Initialize и Terminate происходило выделение и освобождение памяти, используемой закрытой коллекцией. Затем программировались методы специализированной коллекции, предназначенные для внешнего использования. Большинство таких методов сводилось к простому вызову соответствующего метода закрытой коллекции, например:
Sub Add(Item As String) mCollection.Add Item End Sub
Но самое противное начиналось в том случае, если содержимое коллекции требовалось перебирать в цикле For Each. Для этого в модуль класса приходилось включать фрагменты вида:
Public Function NewEnum As lUnknown Set NewEnum = mCollection.[_NewEnum] End Function
Но и это не все – этой функции следовало присвоить идентификатор – 4!
Принцип "абракадабра – достаем из шляпы кролика!" хорош для фокусника, но не для программиста. При использовании наследования вся эта белиберда не нужна. В VB.NET достаточно написать:
Class MyCollection Inherits Collection
…и вы получаете автоматическую поддержку For Each (см. главу 5).