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

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

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

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

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

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

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

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

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

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

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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.