Главная страница Visual 2000 · Общий список статей
Публикации в журнале BYTE/Россия · Публикации на тему MS .NET

Реализация объектно-ориентированной модели языка в Visual Basic .NET

Андрей Колесов

© Андрей Колесов, 2000
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале BYTE/Россия N 1/2001.
Внимание! Статья отражает знание автором предмета на момент ее публикации!

Статья была опубликована в виде врезки к статье "В ожидании Visual Studio.NET".

В течение нескольких лет идут постоянные дебаты...

В течение нескольких лет идут постоянные дебаты о том, может ли Visual Basic считаться языком объектно-ориентированного программирования (ООП). С одной стороны, элементы ООП в нем были всегда, и их число росло от версии к версии. С другой — многих нужных ООП-возможностей в нем не было. Появление VB.NET должно положить всем этим дискуссиям, так как в нем будут реализованы все необходимые атрибуты ООП. Напомним, что модель ООП подразумевает наличие трех обязательных механизмов — инкапсуляции, полиморфизма и наследования. Первые два были реализованы в предудущих версиях и получили развитие в новой, последний — появится впервые.

Первая бета-версия VB.NET показала, что число ее новшеств, похоже, превзошло все ожидания. Более детальное их описание мы сделаем в следующий раз, а пока приведем описание новых элементов языка на концептуальном уровне.

В начало статьи

Parameterized Constructors (Параметрические Конструкторы)

При создании объекта часто бывает крайне желательно передать ему некоторые данные для начальной установки его свойств. Сейчас для этого требуется создание специальных процедур для выполнения таких разовых операций. В VB 7 конструкторы позволять передавать начальные данные в момент создания объектов.

В начало статьи

Encapsulation (Инкапсуляция)

Идея заключается в том, что вы можете создавать скрытый набор процедур (методов и свойств), которые формируют некий программный интерфейс. Другой код может обращаться к этим методам и свойствам, не вдаваясь в подробности их внутренней реализации. Приведенный здесь код демонстрирует возможность "скрытия" отдельных свойств объекта ("Me" ссылается на определенный экземпляр класса):


Protected cName As String
Protected Function ChangeName(NewName)
  Me.cName = NewName
End Function

В начало статьи

Free-threaded (Многопоточность)

Это комплексная концепция поддержки выполнения более одного потока заданий в одно время. Например, пользователь может продолжать работать с приложением, после того как он задал операцию фоновой печати документа. Подобный режим крайне необходим для создания масштабируемых серверных компонентов и может быть полезен для реализации пользовательского интерфейса. Создание таких вычислительных потоков выглядит примерно следующим образом:


Sub CreateMyThread()
  Dim b As BackGroundWork
  Dim t As Thread
  Set b = New BackGroundWork
  Set t = New Thread(New ThreadStart (AddressOf b.Doit))
  t.Start
End Sub

Class BackGroundWork
  Sub Doit()
  ...
  End Sub
End Class

В начало статьи

Inheritance (Наследование)

Это одно из ключевых понятий объектно-ориентированного программирования — возможность использования (в том числе расширения) поведения чужого объекта. Упрощенно говоря, можно создать объект Продукт, а затем на его основе объекты Программный Продукт и Технический Продукт. Оба новых объекта будут наследовать свойства и метода объекта Продукт, при этом вы сможете расширить или изменить поведение наследующего объекта.

VB-разработчики теперь могут использовать ключевое слово Inherits для подключения процедур уже существующего класса:


Class1
  Function GetCustomer()
  ...
  End Function

Class2
  Inherits Class1
  Function GetOrders()
  ...
  End Function

Замена существующего родительского метода выполняется с помощью ключевого слова Overrides.

В начало статьи

Initialezers (Инициализаторы)

Тут все очень просто: в VB отсутствовала давно необходимая и давным- давно реализованная в других языках функция начальной инициализации переменной при ее определении. Теперь вместо


Dim X As Integer: X = 1

можно будет написать:


Dim X As Integer = 1

В начало статьи

Overloading

В русском языке нет термина в данном контексте — использование одного и того же идентификатора для обозначения разных процедур. Выбор нужной процедуры выполняется в зависимости от числа и типа параметров.

Это особенно полезно для создания одного свойства, поддерживающего разные типы аргументов: применение в этом случае типа Variant неудобно хотя бы потому, что характер обработки данных может зависеть от их типа. Описание таких процедур выглядит следующим образом:


Overloads Sub Display (theString As String)
...
Overloads Sub Display (theInteger As Integer)

В начало статьи

Polymorphism (Полиморфизм)

Возможность иметь несколько объектов разного типа, но с одинаковыми методами. Это позволяет писать код, вызывающий нужный метод в зависимости от используемого в данный момент объекта. Например, это может выглядеть таким образом:


Class Employee
  Function PayEmployee
    ' почасовая оплата
    PayEmployee = Hours * HourlyRate
  End Function

Class CommissionedEmployee
  Inherits Employee
  Function PayEmployee
    ' сдельная оплата
    PayEmployee = BasePay + Commissions
  End Function

В данном примере с использованием наследования и замены родительского метода мы создали две разные функции (с одним названием) для классов Employee и CommissionedEmployee.

В начало статьи

Shared Members (Общие члены)

Это методы или переменные, доступные для всех экземпляров класса (каждого объект, базирующийся на данном классе).

В начало статьи

Structured Exception Handling (Структурная обработка особых ситуаций)

Это новая структура для обработки ошибок, которая уже реализована во многих языках. Она должна заменить старую и весьма негибкую (точнее, ненаглядную) конструкцию On Error Goto|Resume|Next. Новый блок содержит ключевые слова Try, Catch, Finally:


Try      ' начало некоторой операции
  Open "TestFile" For Output As #1
  Write #1, SomeInformation$
Catch    ' в случае ошибки выполняется этот код:
  Kill "TestFile"
Finally  ' при отсутствии ошибки выполняется этот код:
  Close #1
End Try

В начало статьи

Type Safety (Контроль типов данных)

Запрет неявного преобразования типов с помощью нового оператора Option Strict. Кому-то из программистов это не понравится, так как данный режим заставит задуматься о типах переменных и использовать специальные функции при присвоении переменной значения другой переменной другого типа. Но это крайне необходимо, если вы хотите писать надежные программы и снизить затраты на отладку приложений.

В этом случае вместо


MySrting$ = 7

придется писать


MySrting$ = Str$(7)

В начало статьи

User Interface Inheritance (Наследование пользовательского интерфейса)

VB7 будет включать наследование форм, т.е. создание новых форм на основе некоторых шаблонов. В отличие от существующего сегодня механизма подключения новых форм на основе шаблонов в данном случае будет автоматически поддерживаться механизм наследования: изменения в родительском шаблоне (например, корпоративных логотип) будут отражаться в дочерних формах.

В начало статьи