С наследованием в C# мы разобрались и можно переходить к следующему «киту» объектно-ориентированного программирования — инкапсуляции. Инкапсуляция — это возможность (механизм) с помощью которой мы можем спрятать от конечного пользователя реализацию того или иного метода, устройства объекта и так далее и представить в пользование только то, что необходимо для работы, обеспечив тем самым целостность объекта. Опять же, определение может быть немного трудным для понимания, поэтому разберемся с ним подробнее и на примерах.
Пример инкапсуляции
Конечным пользователем объекта, в большинстве случаев, является программист. И не всегда этим самым программистом будете вы. Зачем скрывать от пользователя реализацию объекта? Ответ на этот вопрос был наглядно продемонстрирован ещё в самом первом примере работы с классами, когда мы разрабатывали свойства для класса Building
. Вот, например, одно из свойств нашего класса:
private double height; public double Height { get => height; set => height = value > 0 ? value : throw new Exception("Высота здания не может быть менее 0 метров"); }
Что бы произошло, если бы мы не использовали инкапсуляцию и не скрыли бы от пользователя переменную height
, а написали бы код «на заморачиваясь», например, вот так:
public double height;
Как минимум, это привело бы к тому, что мы могли бы задать отрицательное значение высоты здания, что не совсем логично, даже если это какое-то подземное сооружение. Этот только маленький пример того для чего в C# и других языках программирования используется инкапсуляция.
Вполне возможно, что при разработке своих проектов вам придётся писать классы в которых значение того или иного свойства зависят от расчёта величин в одном или нескольких методах вашего класса, которые по сути пользователю не нужны для работы — ему важен конечный результат (значение свойства). В этом случае, вы наверняка используете инкапсуляцию и спрячете «лишние» методы класса в «черный ящик», объявив их с модификатором private
.
Как обеспечивается инкапсуляция в C#
В C# для инкапсуляции используются публичные (public
) свойства и методы объекта, а переменные (за очень редким исключением) остаются закрытыми (private
) от пользователя. Про уровни доступа мы говорили вот в этой статье.
В зависимости от того, какой модификатор доступа мы используем для переменной, свойства или метода, мы можем сделать их публичными, закрытыми или доступными только в потомках и так далее.
Итого
Инкапсуляция в ООП позволяет скрыть от конечного пользователя реализацию той или иной части объекта (класса), обеспечивая тем самым целостность работы. Инкапсуляция в C# реализуется с использованием различных модификаторов доступа к полям и свойствам объектов. Без инкапсуляции нам бы пришлось перед использованием того или иного метода или свойства вникать в реализацию, чтобы не натыкаться на различного рода ограничения и ошибки, с инкапсуляцией же мы в большей степени уверены в том, что внутренние механизмы объекта максимально «разрулят» все возможные проблемы и, в случае необходимости, сообщат нам об исключительной ситуации.