我实例化一个类的两个对象,一个对象访问和更改另一个对象的私有(private)字段。我相信这违反了私有(private)访问控制。它破坏了 OOP 中的封装。但是,我发现 C++ 和 Java 似乎都允许这种“违规”。请赐教为什么允许这种“违规”!
示例 C++ 代码:
#include <iostream>
using namespace std;
class Person
{
private:
int age;
public:
void changeAge(Person & p, int k) // change peer object's private fields
{
p.age = k;
};
Person(int k)
{
age = k;
};
void showAge()
{
cout << this->age << endl;
};
};
int main()
{
Person a(10);
a.showAge();
Person b(11);
b.changeAge(a, 20); // I think the compiler SHOULD generate access violation error
a.showAge();
b.showAge();
return 0;
};
输出是:
10
20
11
您可以为 Java 编写类似的代码,并且您将获得相同的输出。
我咨询了http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html 我了解私有(private)字段在类级别可见。我相信这可能是发生这种“违规”的唯一可行原因。 (如果可以,请补充更多原因!)
但是,我认为允许这种“违规”是没有意义的,因为它破坏了 OOP 中的封装。我们都是人这一事实并不意味着我可以访问和修改您的私有(private)资料。如果可以的话,这不再是您的“私有(private)元素”。
请赐教! “违规”是 C++ 和 Java 的错误吗?如果我错了,请告诉我!
最佳答案
这绝对不是任何一种语言的“错误”。它们已经很成熟,并且被设计成以这种方式运作。访问控制在类级别而不是对象级别运行。因此,当 Person
将某些内容设为私有(private)时,这意味着只有 Person
类中的代码才能对其进行操作,但所讨论的对象无关紧要。
重点是将对象内部知识隔离到特定代码段,而不是确保一个对象不能操纵另一个对象。
不要错误地认为 OOP 是一套完善的规则。许多不同的语言实现了来自 OO 的不同思想,并且它们之间存在差异。如果资源明确地告诉您 OO“意味着”任何特定的事物,那么它们就是在误导您。有很多内容可供语言设计者和程序作者解释。
关于java - C++ 和 Java OOP 访问控制冲突 : access peer object's private fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354649/