Немного истории
Даже такая простая задача, как создание списка с ускоренным поиском, требовала вызова функции API; стандартная операция включения новых строк в список усложнялась тем, что свойство Items списка было доступно только для чтения (к счастью, в VB.NET эти проблемы решаются элементарно [Например, чтобы быстро заполнить список, достаточно присвоить коллекцию свойству DataSource.]).
Более того, многие программисты не понимали, чем же в действительности были формы VB – классами или экземплярами классов? В каком-то смысле и тем и другим. В результате программа выглядела весьма странно:
Forml.Show ' Я – экземпляр Dim newForm As New Forml ' А теперь я – класс newForm.Show
Программисты предпочитают работать с логичными и последовательными моделями, а с точки зрения ООП механизм форм в ранних версиях часто выглядел как нагромождение искусственных и несогласованных "заплат". В VB.NET ситуация полностью изменилась. Здесь формы являются экземплярами класса Windows.Forms.Form, и поведение форм может изменяться посредством наследования точно так же, как и поведение любых других классов .NET Framework. Например, код специализированной формы может начинаться со следующего заголовка:
Public Class MyForm Inherits System.Windows.Forms.Form
После этого форма наделяется новыми возможностями, для чего программист либо переопределяет члены родительского класса Form, либо добавляет в него новые члены, как для любого другого класса (см. главу 5).
В прежних версиях VB элементы даже не считались полноценными классами, поэтому команды вроде следующей были недопустимыми:
Dim myButton As New CommandButton
Перед нами классический пример логической связи "является частным случаем", идеально подходящий для наследования, однако программист не мог определить новый вариант кнопки как производный от базового класса стандартной кнопки.
Возможности создания нестандартных элементов, появившиеся в VB5, были основаны на включении и делегировании, причем в этом процессе использовалась одна из самых непредсказуемых программ-мастеров (wizards) – не говоря уже о том, что элементы, построенные в VB5 и 6, несколько отличались от элементов, построенных на других языках (например, C++ и Delphi).
В .NET элементы и формы являются классами. Как будет показано ниже в этой главе, VB.NET позволяет определить новый класс текстового поля, начинающийся с заголовка следующего вида:
Public Class PositivelntegerTextBox Inherits System.Windows.Forms.TextBox
Далее программист переопределяет или добавляет методы, как в любом другом классе, причем полученный элемент ничем не отличается от элементов, написанных на С# или управляемом C++.
Короче говоря, в предыдущих версиях VB графические приложения строились на весьма шаткой и ненадежной основе, которая к тому же не была в полной мере объектно-ориентированной. Переход к единой программной модели в рамках объектно-ориентированной версии VB потребовал коренного пересмотра этой структуры. Так появилось новое пространство имен Windows.Forms.