调用方法并直接读取/设置参数的私有字段是否会破坏封装?

凯文·塔努贾(Kevin Tanudjaja)

考虑以下代码:

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);
}
一般

封装(计算机编程)

在面向对象的编程(OOP)中,封装是指将数据与对数据进行操作的方法捆绑在一起,或限制对对象某些组件的直接访问

根据定义,它仍然是封装的,位于类型内,并且具有非常特定的可访问性域!

简单地说,您可以访问定义它的类型内的私有字段,其中还包括嵌套的类型/(即使您正在处理对类型的引用),因此(并由规范定义)是允许的。

要获取有关此内容的特定文档,您确实必须深入了解C#规范,您可以在此处找到

这是重要的部分

8.5.2声明的可访问性

...

  • 私有,通过在成员声明中包含私有修饰符来选择。private的直观含义是“访问仅限于包含类型

更进一步

8.5.3可访问性域

...

程序P中以类型T声明的嵌套成员M的可访问域定义如下(请注意,M本身可能是类型):

...

  • 如果声明的M的可访问性是私有的,则M的可访问域是T的程序文本。

...

  • 否则,如果M是私有的,则允许访问,如果它发生在声明M的类型之内。
  • 否则,将无法访问类型或成员,并且会发生编译时错误。

因此,即使它似乎违反直觉的是能够访问私有成员一中方法(当你只能访问一个参考),它仍然封装本身(虽然你可能反对的定义),以及访问

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

反射是否会破坏私有方法的概念,因为私有方法可以在类外部进行访问?

处理对私有映射中存储的值的封装访问而不破坏C ++中抽象的标准方法

生成仅通过转发参数来调用类私有字段方法的方法吗?

为带有可选参数的最终私有字段设置默认实例的最佳方法是什么?

是否有可能禁用“选项作为字段或参数类型”检查中的IntelliJ的私有方法?

如何使用 JUnit 中的公共方法测试私有字段是否设置为提供的值?

更改类私有数据成员的顺序是否会破坏ABI

调用函数是否会破坏recover()?

封装私有常量

如何使用in参数直接调用带有ref参数的方法

允许构造函数调用私有方法的默认参数

Ruby工厂方法调用私有设置程序

设置私有变量以在封装的JavaScript函数中重用

将 ref 参数设置为私有方法

Nsubstitute 测试是否调用了私有类的方法

是否可以通过反射来调用私有属性或方法

测试是否在Service中调用了私有方法

JMockit验证是否调用了私有方法

添加新字段(和/或方法)是否会破坏OCP(开放式封闭原则)?

向函数添加具有默认值的参数是否会破坏ABI?

在“代码隐藏”事件中调用View Model方法是否会破坏MVVM?

覆盖toString时,更好地使用getter方法还是直接访问私有字段?

调用私有方法

委托模式会破坏封装吗?

用反射设置私有字段值

为什么我可以通过 Object#send 调用私有方法,但不能直接调用所述方法?

私有字段是否由子类继承?

子类是否继承私有字段?

如果我对模拟对象设置了期望值,是否可以在我正在测试的方法调用的私有方法中使用它?