Инкапсуляция помогает, изолируя классы вызовов от изменений.
Давайте представим, что у вас есть простой класс, который моделирует автомобильный двигатель (потому что все примеры ОО должны включать аналогию с автомобилем :)). У вас может быть простое поле, подобное этому:
private bool engineRunning;
Если просто сделать это поле общедоступным или указать метод получения IsEngineRunning (), это не будет чем-то отличаться.
Теперь предположим, что вы делаете свой класс более сложным, вы хотите удалить это поле и заменить его на:
private bool ignitionOn;
private bool starterWasActivated;
Теперь, если у вас есть много классов, обращающихся к старому полю engineRunning
, вы должны пойти и изменить их все (плохие времена).
Если вместо этого вы начали с:
public bool IsEngineRunning()
{
return this.engineRunning;
}
Теперь вы можете изменить его на:
public bool IsEngineRunning()
{
return ignitionOn && starterWasActivated;
}
и интерфейс класса остается прежним (хорошие времена).