Защита полей от вмешательства извне
Поля, запрещенные для доступа извне, объявляются закрытыми. Методов доступа к ним не существует. Никаким способо изменить или получить значение невозмонжо. Как вариант, поле закрывается, открывается метод доступа по чтению.
Пример
Определить класс Точка, описывающий точки, расположенные на луче, выходящем из начала координат. Координаты точки полярны как для разработчика, так и для пользователя.
Объект должен иметь возможность передвигаться по лучу и выдавать информацию о своем теккущем положении.
class Точка
{
private double fi, d;
public Точка(double fi)
{ this.fi = fi; }
public void Установить(double d)
{ this.d=d;}
public double ВычислитьFI()
{return fi;}
public double ВыдатьD()
{ return d; }
}
class Program
{
public static void Main()
{
Точка t; double fi;
t = new Точка(Math.PI/2);
t.Установить(5.0);
fi=t.ВычислитьFI();
}
}
}
Альтернативой инкапсуляции с точки зрения защитных полей являются открытые поля доступные для чтения. Поле, открытое для чтения, может быть установлено конструктором. Дальнейшие изменения запрещены.
Пример аналогичен предыдущему, реализован через открытые поля для чтения.
class Точка
{
public readonly fi;
private double d;
public Точка(double fi)
{ this.fi = fi; }
public void Установить(double d)
{ this.d=d;}
public double ВычислитьFI()
{return fi;}
public double ВыдатьD()
{ return d; }
}
class Program
{
public static void Main()
{
Точка t; double fi;
t = new Точка(Math.PI/2);
t.Установить(5.0);
fi=t.fi; //45 градусов
}
}
}
Возможно использование открытых статических полей только для чтения. Такие поля должны иметь инициализатор. Значение поля устанавливается до создания объекта и изменение его (даже с помощью конструктора) невозможно.
Свойства
Свойство – это метод для установки и-или получения закрытого поля. С этой точки зрения свойство относится к интерфейсной части класса.
Определение свойства:
public_Тип возвращаемого значения_Имя свойства
// параметров нет, поэтому скобок после имени нет и быть не может
{ set {код для установки поля}
неявный параметр (value)
get {код для чтения поля}
}
Свойства используются для поддержки инкапсуляции, создания виртуальных полей (т.е. реально полей нет, но у пользователя создается впечатление, что они есть; на самом деле значение вычисляется).
Пример
Определить класс Точка на плоскости в прямоугольных координатах, точка может располагаться только выше оси х или на ней.
Предусмотреть возможность изменения координат точки и вычисление расстояния до нее. Операции рассматривать, как свойства.
class Точка
{
private double x, y;
public double xp
{
set { x = value; }
get { return x; }
}
public double yp
{
set
{
if (value >= 0)
y = value;
else y = 0;
}
get { return y; }
}
public double Dp
{
get { return Math.Sqrt(x * x + y * y); }
}
}
class Program
{
public static void Main()
{
Точка t;
t = new Точка();
t.xp = 3.0;
t.yp = 4.0;
t.Dp;// => 5.0
}
}
АГРЕГАЦИЯ
Дата добавления: 2019-02-08; просмотров: 586;