访问同一类中另一个对象的私有字段

2022-08-31 10:04:43
class Person 
{
   private BankAccount account;

   Person(BankAccount account)
   {
      this.account = account;
   }

   public Person someMethod(Person person)
   {
     //Why accessing private field is possible?

     BankAccount a = person.account;
   }
}

请忘记设计。我知道OOP指定私有对象是类的私有对象。我的问题是,为什么OOP被设计成私有字段具有类级访问权限而不是对象级访问权限


答案 1

我对答案也有点好奇。

我发现的最令人满意的答案来自Artemix的另一篇文章(我正在重命名AClass with Person类):为什么有类级访问修饰符而不是对象级?

私有修饰符强制执行封装原则。

这个想法是,“外部世界”不应该对Person内部流程进行更改,因为Person的实现可能会随着时间的推移而改变(并且您必须更改整个外部世界以修复实现中的差异 - 这几乎是不可能的)。

当 Person 的实例访问其他 Person 实例的内部时 - 您可以确保两个实例始终都知道 Person 的实现细节。如果内部到 Person 流程的逻辑发生更改 - 您所要做的就是更改 Person 的代码。

编辑:请投票给Artemix的答案。我只是复制粘贴它。


答案 2

问得好。似乎对象级访问修饰符将进一步强制实施封装原则。

但实际上情况恰恰相反。让我们举个例子。假设您希望在构造函数中深度复制某个对象,如果您无法访问该对象的私有成员。然后,唯一可能的方法是向所有私有成员添加一些公共访问器。这将使你的对象裸露在系统的所有其他部分。

因此,封装并不意味着对世界其他地区都关闭。这意味着要有选择性地选择你想向谁敞开心扉。