ПОНЯТНО О Visual Basic NET (том 3)


Поля и свойства объектов


Функция вместо поля. Вернемся к нашему садовому хозяйству. Вот кому-то снаружи класса понадобился периметр участка. А он его не видит, так как он у нас объявлен Private. Пожалуйста, нам не жалко, сделаем его полем:

Public Периметр As Integer

Теперь он виден всем. И это хорошо. Плохо то, что теперь все, кому не лень, смогут менять наш периметр операторами типа

Участки(k).Периметр = 25

Что же получается? Мы старались, вычисляли периметр по правильной формуле, а тут кто-то раз! – и присвоил ему значение, которое непонятно откуда взялось! Нет, так не годится, вернем все как было:

Private Периметр As Integer

Но теперь недоволен заказчик: ему нужно знать периметр. Что же делать? Нужно устроить так, чтобы периметр был все-таки виден и в то же время защитить его от посягательств. Читать – читайте, а менять извне его значение нельзя!

Как этого добиться? Вот простой способ. Придумаем функцию Периметр_участка, все тело которой состоит из единственного оператора:

    Public Function Периметр_участка() As Integer

        Return Периметр

    End Function

Теперь любой желающий извне может узнать значение периметра таким, например, оператором:

        Debug.WriteLine(Участки(k).Периметр_участка)

Поскольку такие обращения к переменной и функции без параметров синтаксически неотличимы, то снаружи могут сколько угодно думать, что обращаются к переменной Периметр_участка, когда на самом деле это функция. И кому какая разница?

А где же здесь желанная цель «только для чтения»? А она достигнута. Потому что присваивать значение функции мы можем только в ее теле, а уж никак не из других модулей. Попробуйте – VB придерется.

На всякий случай напомню, что ответственность за то, чтобы в ячейке Периметр в нужный момент находилось нужное значение, лежит на программисте. Так, в нашем случае, прежде чем дать возможность пользователю со стороны узнать, чему равен периметр, нужно позаботиться, чтобы была выполнена процедура Вычисляем_периметр.

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




Начало  Назад  Вперед