Инкапсуляция .. наиболее точное описание?

#c# #oop

#c# #ооп

Вопрос:

Я знаю, что инкапсуляция означает что-то вроде того, что один объект не должен иметь прямого доступа к элементам разных объектов … но я предполагаю, что это относится к общедоступным полям? Я предполагаю, что общедоступные методы не нарушают инкапсуляцию ..? Я просто не совсем понимаю здесь и был бы рад любому объяснению.

Ответ №1:

Инкапсуляция — это то, по чему вы водите свою машину:

  • поворот ключа зажигания
  • управление рулем
  • переключение передач (если не автоматическое)
  • добавление топлива

и не по:

  • воспламенение топлива в цилиндрах
  • трение шин и грунта
  • и так далее…

Раскрыть (создать public ) ЧТО и скрыть (создать private ) КАК. Теперь вы инкапсулируете.

🙂

Ответ №2:

Инкапсуляция не означает, что не должно быть никакого доступа к элементам. Это означает, что вы должны разрешать доступ только к элементам, которые должны использоваться, в основном ограниченный доступ вместо отсутствия доступа.

Делая что-то общедоступным, вы разрешаете доступ, делая это приватным — нет.

В этой статье рассматривается более подробно, а также различные модификаторы доступа:

http://www.csharp-station.com/Tutorials/lesson19.aspx

В этой статье они приводят хороший пример:

 using System;

class BankAccountProtected
{
    public void CloseAccount()
    {
        ApplyPenalties();
        CalculateFinalInterest();
        DeleteAccountFromDB();
    }

    protected virtual void ApplyPenalties()
    {
        // deduct from account
    }

    protected virtual void CalculateFinalInterest()
    {
        // add to account
    }

    protected virtual void DeleteAccountFromDB()
    {
        // send notification to data entry personnel
    }
}
  

Когда программист хочет закрыть учетную запись, ему не нужно беспокоиться о различных шагах, которые выполняются для этого:

  1. Применяемые права
  2. ВычислитьFinalInterest
  3. Удалить ACCOUNTFROMDB

Они должны просто сказать, что хотят, чтобы это было закрыто, и что все необходимые шаги будут предприняты. Вот почему CloseAccount является общедоступным, а другие нет.

Ответ №3:

Я нахожу наиболее полезным думать о классах, таких как люди с разными заданиями. Например, если я менеджер проекта, а вы разработчик, мой публичный контракт с вами заключается в том, что я буду назначать вам задачи. Как мне определить приоритет? Это деталь, которая является частной для меня; вам как разработчику не нужно знать это, чтобы выполнять свою работу.

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

Комментарии:

1. Тьфу, вы (менеджер) предоставляете свои методы разработчику… Разве не наоборот, что все должно работать? 🙂

Ответ №4:

Инкапсуляция скрывает детали реализации объекта, чтобы не было внешних зависимостей от конкретной реализации. взято из блога msdn.

Взгляните на этот пост CodeProject.