Поделиться через


Объекты и классы в Visual Basic

Объект — это сочетание кода и данных, которые можно рассматривать как единицу. Объект может быть частью приложения, например элемента управления или формы. Целое приложение также может быть объектом.

При создании приложения в Visual Basic вы постоянно работаете с объектами. Можно использовать объекты, предоставляемые Visual Basic, такие как элементы управления, формы и объекты доступа к данным. Вы также можете использовать объекты из других приложений в приложении Visual Basic. Вы можете даже создать собственные объекты и определить для них дополнительные свойства и методы. Объекты действуют как готовые стандартные блоки для программ— они позволяют писать фрагмент кода один раз и повторно использовать его снова и снова.

В этом разделе подробно рассматриваются объекты.

Объекты и классы

Каждый объект в Visual Basic определяется классом. Класс описывает переменные, свойства, процедуры и события объекта. Объекты — это экземпляры классов; вы можете создать столько объектов, сколько нужно после определения класса.

Чтобы понять связь между объектом и его классом, думайте о формочках для печения и печенье. Срез cookie — это класс. Он определяет характеристики каждого файла cookie, например размер и фигуру. Класс используется для создания объектов. Объекты — это файлы cookie.

Прежде чем получить доступ к его членам, необходимо создать объект, за исключением Shared элементов, к которым можно получить доступ без объекта класса.

Создание объекта из класса

  1. Определите, из какого класса нужно создать объект или определить собственный класс. Рассмотрим пример.

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Напишите инструкцию Dim , чтобы создать переменную, в которую можно назначить экземпляр класса. Переменная должна иметь тип требуемого класса.

    Dim nextCustomer As Customer
    
  3. Добавьте ключевое слово New Operator для инициализации переменной в новый экземпляр класса.

    Dim nextCustomer As New Customer
    
  4. Теперь можно получить доступ к членам класса с помощью переменной объекта.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Замечание

По возможности следует объявлять переменную типом класса, который вы собираетесь присвоить. Это называется ранней привязкой. Если вы не знаете тип класса во время компиляции, можно вызвать позднюю привязку , объявив переменную типом данных объекта. Однако поздняя привязка может замедлить производительность и ограничить доступ к членам объекта во время выполнения. Дополнительные сведения см. в объявлении переменной объектов.

Несколько случаев

Объекты, созданные из класса, часто идентичны друг другу. Как только они существуют в качестве отдельных объектов, их переменные и свойства можно изменять независимо от других экземпляров. Например, при добавлении трех флажков в форму каждый объект флажка является экземпляром CheckBox класса. Отдельные CheckBox объекты используют общий набор характеристик и возможностей (свойств, переменных, процедур и событий), определенных классом. Однако каждое из них имеет собственное имя, его можно включить и отключить, и можно поместить в другое местоположение на форме.

Элементы объекта

Объект — это элемент приложения, представляющий экземпляр класса. Поля, свойства, методы и события являются стандартными блоками объектов и составляют их члены.

Доступ к членам

Доступ к члену объекта осуществляется путем последовательного указания имени переменной объекта, точки (.) и имени члена. В следующем примере задается Text свойство Label объекта.

warningLabel.Text = "Data not saved"

Список участников IntelliSense

IntelliSense перечисляет члены класса при вызове параметра "Члены списка", например при вводе периода (.) в качестве оператора доступа к членам. Если ввести период после имени переменной, объявленной как экземпляр этого класса, IntelliSense перечисляет все члены экземпляра и ни один из общих элементов. Если ввести период после самого имени класса, IntelliSense перечисляет все общие члены и ни один из элементов экземпляра. Дополнительные сведения см. в разделе Using IntelliSense.

Поля и свойства

Поля и свойства представляют сведения, хранящиеся в объекте. Вы извлекаете и задаете их значения с операторами присваивания так же, как вы извлекаете и задаете локальные переменные в процедуре. В следующем примере извлекается Width свойство и задается ForeColor свойство Label объекта.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Обратите внимание, что поле также называется переменной-членом.

Используйте процедуры свойств, когда:

  • Необходимо контролировать, когда и как задано или извлекается значение.

  • Свойство имеет четко определенный набор значений, которые необходимо проверить.

  • Установка значения приводит к заметному изменению состояния объекта, например свойству IsVisible .

  • Установка свойства приводит к изменению других внутренних переменных или значений других свойств.

  • Перед настройкой или извлечением свойства необходимо выполнить набор шагов.

Используйте поля, когда:

  • Значение относится к самопроверяющемуся типу. Например, ошибка или автоматическое преобразование данных происходит, если переменной True присваивается значение, отличное от False или Boolean.

  • Любое значение в диапазоне, поддерживаемом типом данных, допустимо. Это верно для многих свойств типа Single или Double.

  • Свойство является типом String данных, и нет ограничений на размер или значение строки.

  • Дополнительные сведения см. в разделе "Процедуры свойств".

Подсказка

Всегда держите непостоянные поля приватными. Если вы хотите сделать его общедоступным, вместо этого используйте свойство.

Методы

Действие, которое выполняет объект, называется методом. Например, Add является методом ComboBox объекта, добавляющим новый элемент в выпадающий список.

В следующем примере демонстрируется метод Start объекта Timer.

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Обратите внимание, что метод — это просто процедура , которая предоставляется объектом.

Дополнительные сведения см. впроцедур .

События

Событие — это действие, распознаваемое объектом, например щелчком мыши или нажатием клавиши, и для которого можно написать код для ответа. События могут возникать в результате действия пользователя или кода программы или могут быть вызваны системой. Код, который сигнализирует о событии, называется генерирующим событие, а код, который отвечает на него, называется обрабатывающим его.

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

Члены экземпляра и общие члены

При создании объекта из класса результатом является экземпляр этого класса. Члены, которые не объявлены с ключевым словом Shared, являются членами экземпляра, которые принадлежат строго этому конкретному экземпляру. Экземплярный член в одном экземпляре независим от такого же члена в другом экземпляре того же класса. Например, переменная члена экземпляра может иметь разные значения в разных экземплярах.

Члены, объявленные ключевым Shared словом, являются общими членами, которые относятся к классу в целом, а не к конкретному экземпляру. Общий член существует только в одном экземпляре, независимо от того, сколько экземпляров класса вы создаете, или даже если вы не создаете ни одного экземпляра. Например, общая переменная-член имеет только одно значение, доступное для всего кода, доступного к классу.

Доступ к не общим членам

  1. Убедитесь, что объект был создан из своего класса и назначен переменной объекта.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. В инструкции, которая обращается к члену, сначала укажите имя переменной объекта, затем оператор доступа к члену (.), и после этого имя члена.

    secondForm.Show()
    

Доступ к общим членам

  • Чтобы после имени класса следовал оператор доступа к члену (.), а затем имя члена. Вы всегда должны обращаться к элементу Shared объекта непосредственно через имя класса.

    Console.WriteLine("This computer is called " & Environment.MachineName)
    
  • Если вы уже создали объект из класса, можно также получить доступ к Shared члену с помощью переменной объекта.

Различия между классами и модулями

Основное различие между классами и модулями заключается в том, что классы можно создать в виде объектов, а стандартные модули не могут. Так как существует только одна копия данных стандартного модуля, если одна часть программы изменяет общедоступную переменную в стандартном модуле, любая другая часть программы получает то же значение, если он считывает эту переменную. В отличие от этого, данные объектов существуют отдельно для каждого инстанцированного объекта. Другое отличие заключается в том, что в отличие от стандартных модулей классы могут реализовывать интерфейсы. Если класс помечен модификатором MustInherit , он не может быть создан напрямую. Тем не менее, он всё же отличается от модуля, поскольку его можно унаследовать, в то время как модули не могут быть унаследованы.

Замечание

Shared Когда модификатор применяется к члену класса, он связан с самим классом вместо конкретного экземпляра класса. Доступ к члену осуществляется напрямую с помощью имени класса, так же, как к членам модуля.

Классы и модули также используют разные области видимости для своих элементов. Члены, определенные в классе, находятся в пределах определенного экземпляра класса и существуют только в течение времени существования объекта. Чтобы получить доступ к членам класса извне класса, необходимо использовать полные имена в формате Object. Член.

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

Повторное использование классов и объектов

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

.NET предоставляет множество примеров компонентов, доступных для использования. В следующем примере используется TimeZone класс в System пространстве имен. TimeZone предоставляет элементы, позволяющие получать сведения о часовом поясе текущей компьютерной системы.

Public Sub ExamineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
    Console.WriteLine(s)
End Sub

В предыдущем примере первая инструкция Dim объявляет объектную переменную типа TimeZone и назначает ему TimeZone объект, возвращаемый свойством CurrentTimeZone .

Связи между объектами

Объекты могут быть связаны друг с другом несколькими способами. Основные типы отношений — это иерархические и вложенные.

Иерархическая связь

Когда классы являются производными от более фундаментальных классов, они, как говорят, имеют иерархическую связь. Иерархии классов полезны при описании элементов, которые являются подтипом более общего класса.

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

Определение класса, производного от уже существующего класса

  1. Используйте инструкцию класса для определения класса, из которого необходимо создать нужный объект.

    Public Class ReversibleButton
    

    Убедитесь, что после последней строки кода в вашем классе следует инструкция End Class. По умолчанию интегрированная среда разработки (IDE) автоматически создает оператор End Class при вводе инструкции Class .

  2. Следуйте за заявлением Class немедленно использованием инструкции "Наследуется". Укажите класс, из которого наследуется новый класс.

    Inherits System.Windows.Forms.Button
    

    Новый класс наследует все члены, определенные базовым классом.

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

    Public Class ReversibleButton
        Inherits System.Windows.Forms.Button
            Public Sub ReverseColors()
                Dim saveColor As System.Drawing.Color = Me.BackColor
                Me.BackColor = Me.ForeColor
                Me.ForeColor = saveColor
           End Sub
    End Class
    

    При создании объекта из класса ReversibleButton он может получить доступ ко всем членам класса Button, а также к методу ReverseColors и всем другим новым членам, которые вы определите в ReversibleButton.

Производные классы наследуют члены из класса, на которых они основаны, что позволяет добавить сложность по мере продвижения в иерархии классов. Дополнительные сведения см. в разделе "Основы наследования".

Компиляция кода

Убедитесь, что компилятор может получить доступ к классу, от которого вы хотите создать производный класс. Это может означать полное определение его имени, как в предыдущем примере, или определение пространства имен в операторе Import (пространство имен и тип.NET). Если класс находится в другом проекте, может потребоваться добавить ссылку на этот проект. Дополнительные сведения см. в разделе "Управление ссылками в проекте".

Отношение вложения

Другим способом, которым могут быть связаны объекты, является связь с привязкой. Объекты контейнеров логически инкапсулируют другие объекты. Например, OperatingSystem объект логически содержит Version объект, который он возвращает через его Version свойство. Обратите внимание, что объект контейнера физически не содержит никакого другого объекта.

Коллекции

Один конкретный тип содержащегося объекта представлен коллекциями. Коллекции — это группы похожих объектов, которые можно перечислить. Visual Basic поддерживает определенный синтаксис в операторе For Each...Next который позволяет перебирать элементы коллекции. Кроме того, коллекции часто позволяют использовать Item[], чтобы извлекать элементы по их индексу или связывать их с уникальной строкой. Коллекции могут быть проще использовать, чем массивы, так как они позволяют добавлять или удалять элементы без использования индексов. Из-за простоты использования коллекции часто используются для хранения форм и элементов управления.

Пошаговое руководство. Определение классов
Содержит пошаговое описание создания класса.

Перегруженные свойства и методы
Перегруженные свойства и методы

Основы наследования
Охватывает модификаторы наследования, переопределяющие методы и свойства, MyClass и MyBase.

Время существования объекта: как создаются и уничтожаются объекты
Описывает создание и удаление экземпляров классов.

Анонимные типы
Описывает создание и использование анонимных типов, которые позволяют создавать объекты без написания определения класса для типа данных.

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

Практическое руководство. Вывод имен свойств и типов в объявлениях анонимных типов
Объясняет, как выводить имена и типы свойств в объявлениях анонимных типов. Содержит примеры успешного и неудачного вывода.