Основная концепция инкапсуляции
До сих пор переменные и методы наших классов описывались с модификатором доступа public. Это позволяло использовать их за пределами класса. Например, для увеличения роста человека, на которого ссылается переменная p можно написать оператор:
p.Height++;
Однако в современном объектно-ориентированном программировании действует правило инкапсуляции, согласно которому все переменные класса делаются закрытыми (private), то есть недоступными за пределами класса. Доступ к этим переменным осуществляется через открытый интерфейс – открытые методы класса.
Пример 1:
class Person
{
private string name;
private double height;
private double weight;
public Person(string Name, double Height, double Weight)
{
name=Name;
height=Height;
weight=Weight;
}
public Person( )
{
name=”noname”;
height=50;
weight=4;
}
public void PersonAnalyze()
{
if (height-weight>100)
Console.WriteLine(name+" полный");
else
Console.WriteLine(name + " худой");
}
}
Отметим два вида изменений:
– все переменные класса описаны с использованием модификатора доступа private;
– имена этих переменных начинаются с маленькой буквы. Хотя это и не является строгим правилом языка, однако большинство программистов делают так, чтобы уже по имени переменной определить ее закрытый статус.
Теперь за пределами класса уже нельзя осуществить непосредственное использование переменных. Однако выход есть.
Например, можно создать в классе два открытых метода для доступа к каждой переменной:
public double GetHeight()
{
return height;
}
public void SetHeight(double newHeight)
{
height=newHeight;
}
Теперь для увеличения роста человека на единицу потребуется два вызова методов:
p.SetHeight(p.GetHeight()+1);
Главный вопрос здесь – зачем нужно такое ограничение? Ведь последняя строка не только «ужасно» выглядит, но и замедляет выполнение программы. Дело в том, что преимущества инкапсуляции намного важнее, чем упомянутые здесь недостатки.
Вспомним, что важнейшей целью объектно-ориентированного программирования является уменьшение разрыва в понятиях программной реализации и предметной области, чтобы сделать процесс программирования похожим на моделирование, использующее элементы предметной области.
Если оператор
p.Height++;
еще может соответствовать реальному процессу (увеличение роста человека), то как можно содержательно трактовать оператор
p.Height--;
или
p.Height=-10;
Таким образом, непосредственное использование переменных не способствует поддержке правил и ограничений предметной области.
Дата добавления: 2015-10-26; просмотров: 743;