Общие данные в классах. Общие члены классов.
Вернемся к классу Е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