Cамоучитель по 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. Конечно, объявление открытых констант не приводит к нарушению инкапсуляции.

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





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