Главная страница Visual 2000
· Общий список статей
Публикации в журнале BYTE/Россия
· Публикации на тему MS .NET
Андрей Колесов
© Андрей Колесов, 2000В течение нескольких лет идут постоянные дебаты...
В течение нескольких лет идут постоянные дебаты о том, может ли Visual Basic считаться языком объектно-ориентированного программирования (ООП). С одной стороны, элементы ООП в нем были всегда, и их число росло от версии к версии. С другой — многих нужных ООП-возможностей в нем не было. Появление VB.NET должно положить всем этим дискуссиям, так как в нем будут реализованы все необходимые атрибуты ООП. Напомним, что модель ООП подразумевает наличие трех обязательных механизмов — инкапсуляции, полиморфизма и наследования. Первые два были реализованы в предудущих версиях и получили развитие в новой, последний — появится впервые.
Первая бета-версия VB.NET показала, что число ее новшеств, похоже, превзошло все ожидания. Более детальное их описание мы сделаем в следующий раз, а пока приведем описание новых элементов языка на концептуальном уровне.
Parameterized Constructors (Параметрические Конструкторы)
При создании объекта часто бывает крайне желательно передать ему некоторые данные для начальной установки его свойств. Сейчас для этого требуется создание специальных процедур для выполнения таких разовых операций. В VB 7 конструкторы позволять передавать начальные данные в момент создания объектов.
Идея заключается в том, что вы можете создавать скрытый набор процедур (методов и свойств), которые формируют некий программный интерфейс. Другой код может обращаться к этим методам и свойствам, не вдаваясь в подробности их внутренней реализации. Приведенный здесь код демонстрирует возможность "скрытия" отдельных свойств объекта ("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
Это одно из ключевых понятий объектно-ориентированного программирования — возможность использования (в том числе расширения) поведения чужого объекта. Упрощенно говоря, можно создать объект Продукт, а затем на его основе объекты Программный Продукт и Технический Продукт. Оба новых объекта будут наследовать свойства и метода объекта Продукт, при этом вы сможете расширить или изменить поведение наследующего объекта.
VB-разработчики теперь могут использовать ключевое слово Inherits для подключения процедур уже существующего класса:
Class1 Function GetCustomer() ... End Function Class2 Inherits Class1 Function GetOrders() ... End Function
Замена существующего родительского метода выполняется с помощью ключевого слова Overrides.
Тут все очень просто: в VB отсутствовала давно необходимая и давным- давно реализованная в других языках функция начальной инициализации переменной при ее определении. Теперь вместо
Dim X As Integer: X = 1
можно будет написать:
Dim X As Integer = 1
В русском языке нет термина в данном контексте — использование одного и того же идентификатора для обозначения разных процедур. Выбор нужной процедуры выполняется в зависимости от числа и типа параметров.
Это особенно полезно для создания одного свойства, поддерживающего разные типы аргументов: применение в этом случае типа Variant неудобно хотя бы потому, что характер обработки данных может зависеть от их типа. Описание таких процедур выглядит следующим образом:
Overloads Sub Display (theString As String) ... Overloads Sub Display (theInteger As Integer)
Возможность иметь несколько объектов разного типа, но с одинаковыми методами. Это позволяет писать код, вызывающий нужный метод в зависимости от используемого в данный момент объекта. Например, это может выглядеть таким образом:
Class Employee Function PayEmployee ' почасовая оплата PayEmployee = Hours * HourlyRate End Function Class CommissionedEmployee Inherits Employee Function PayEmployee ' сдельная оплата PayEmployee = BasePay + Commissions End Function
В данном примере с использованием наследования и замены родительского метода мы создали две разные функции (с одним названием) для классов Employee и CommissionedEmployee.
Это методы или переменные, доступные для всех экземпляров класса (каждого объект, базирующийся на данном классе).
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 будет включать наследование форм, т.е. создание новых форм на основе некоторых шаблонов. В отличие от существующего сегодня механизма подключения новых форм на основе шаблонов в данном случае будет автоматически поддерживаться механизм наследования: изменения в родительском шаблоне (например, корпоративных логотип) будут отражаться в дочерних формах.