Иллюстрированный самоучитель по VB.NET

       

Общие данные в классах


Вернемся к классу Еmploуее. Допустим, каждому работнику необходимо присвоить уникальный номер. В старых версиях VB задача решалась при помощи глобальных переменных, что приводило к нарушению инкапсуляции и создавало потенциальную угрозу случайного изменения номеров внешним кодом. Логика подсказывает, что номер должен увеличиваться только при создании нового объекта Empl оуее.

В VB .NET наконец-то появились средства для достижения этой цели. Идея проста: в классе определяются данные, совместно используемые всеми экземплярами данного класса, однако внешний доступ к этим данным находится под вашим полным контролем (например, через обращение к свойству). Не стоит и говорить, что эти поля никогда не должны объявляться открытыми...

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

Ниже приведен фрагмент новой версии класса Employee с использованием общих данных для присвоения номеров. В классе определяется закрытая общая переменная типа Integer, которая:

  • имеет начальное значение 1;

  • ассоциируется со ReadOnly-свойством, возвращающим ее текущее значение;

  • изменяется (увеличивается) только в конструкторе класса.

    В совокупности это означает, что работнику никогда не будет присвоен номер 0 и что новый номер выделяется только при создании нового объекта Empl oyee — именно это нам и требовалось:

    Public Class Employee

    Private m_Name As String

    Private m_Salary As Decimal

    Private Shared m_EmployeeID As Integer = 1

    Public Sub New(ByVal theName As String. ByVal curSalary As Decimal)



    m_Name = thename



    m_Salary = curSalary

    m_EmployeeID = m_EmployeeID + 1

    End Sub

    Readonly

    Property Employeeld() As Integer

    Get

    Employeeld = m_EmployeeID

    End Get

    End Property

    End Class

    Ниже приведена небольшая программа для тестирования класса Empl oyee, а также полный код класса с общим полем:

    Option Strict On Module Modulel

    Sub Main()

    Dim Tom As New Employee("Tom". 100000)

    System.Console.WriteLine(Tom.TheName & "is employee! " & _

    Tom. Employee ID & "with salary " & Tom.SalaryO)

    Dim Sally As New Employee("Sally". 150000)

    System.Console.WriteLine(Sally.TheName & "is employee!" & _

    Sally.EmployeeID &"with salary "SSally.Salary())

    System.Console.WriteLine("Please press the Enter key")

    System.Console.Read()

    End Sub

    End Module

    Public Class Employee

    Private m_Name As 'String

    Private m_Salary As Decimal

    Private Shared m_EmployeeID As Integer = 1

    Public Sub New(ByVal theName As String.ByVal curSalary As Decimal)

    m_Name = thename

    m_Salary = curSalary

    m_EmployeeID = m_EmployeeID + 1

    End Sub Readonly Property Employeeld()As Integer

    Get

    Employeeld = m_EmployeeID

    End Get End Property Readonly

    Property TheName() As String

    Get

    TheName = m_Name

    End Get . End Property Readonly

    Property Salary () As Decimal

    Get

    Salary = m_Sa1ary

    End Get

    End Property

    End Class

    Обращения к константам в классах не отличаются от обращений к общим полям, но при объявлении констант вместо Shared используется ключевое слово Const. Конечно, объявление открытых констант не приводит к нарушению инкапсуляции.

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


    Содержание раздела