Разве вызов метода и непосредственное чтение / установка приватных полей аргумента нарушает инкапсуляцию? - PullRequest
2 голосов
/ 13 февраля 2020

рассмотрите следующий код:

public class Counter
{
    private int _value;

    // public int Value => _value;
    // commented for asking purposes

    public void Increment() {
        _value++;
    }

    public void Decrement() {
        _value--;
    }

    public void CopyOtherCounter(Counter other)
    {
        _value = other._value;
        // the compiler didn't show any error here
        // why it does not break encapsulation?
    }
}

Я хотел бы спросить, означает ли это нарушение инкапсуляции или нет.

Редактировать: потому что я думаю, что я не должен быть в состоянии читать другие Личное значение объекта, даже если оно того же типа. Потому что это может произойти:

public class Person {
    private float _walletMoney; // no getter
    private void StealFrom(Person other) {
        _walletMoney += other._walletMoney; //reading other private wallet
        other._walletMoney = 0; //writing other private wallet
    }
}

void Main() {
    var John = new Person();
    var Bob = new Person();
    John.StealFrom(Bob);
}

1 Ответ

2 голосов
/ 13 февраля 2020

Инкапсуляция (компьютерное программирование)

В объектно-ориентированном программировании (OOP) инкапсуляция относится к связыванию данных с методами, которые работают с этими данными, или ограничение прямого доступа к некоторым компонентам объекта

По определению он все еще инкапсулирован, находится внутри типа и имеет очень специфический c домен доступности!

Проще говоря, вы можете получить доступ к закрытым полям в типе, который его определил , это также включает вложенные типы / классы (даже если вы имеете дело с ссылка на тип), как таковая (и определенная спецификациями), разрешена.

Чтобы получить конкретную c документацию по этому вопросу, вам действительно нужно go для глубокого погружения через C# Спецификация , которую вы можете найти здесь

Вот важные части

8.5.2 Заявленная доступность

...

  • Pri vate, который выбирается включением частного модификатора в объявление члена. Интуитивно понятное значение private: « доступ ограничен типом содержимого

Далее more

8.5.3 Домены доступности

...

Область доступности вложенного члена M, объявленного в типе T в программе P, определяется следующим образом (с учетом того, что сам M может быть типом ):

...

  • Если заявленная доступность M является закрытой, доменом доступности M является текст программы T.

...

  • В противном случае, если M является частным, доступ разрешается, если он происходит в пределах типа, в котором объявлен M.
  • В противном случае тип или член недоступны, и происходит ошибка времени компиляции.

Таким образом, даже если нелогично иметь возможность доступа к частному члену в пределах метод (когда у вас есть доступ только к ссылке ), его все еще инкапсулируется p er-se (хотя вы можете поспорить с определением) и доступный

...