我实例化一个类的两个对象,一个对象访问并更改另一个对象的私有字段。我认为这违反了私人访问控制。它破坏了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 我理解私人领域在班级可见。我相信这可能是发生这种“违规”的唯一可行原因。 (如果可以,请添加更多理由!)
但是,我认为允许这种“违规”并不合理,因为它破坏了OOP中的封装。我们都是人类这一事实并不意味着我可以访问和修改你的私人资料。如果可以的话,它不再是你的“私人物品”。
请赐教! “违规”是否是C ++&amp;的错误? Java的?如果我错了,请告诉我!
答案 0 :(得分:4)
绝对不是&#34; bug&#34;用两种语言它们已经很成熟,并且设计为以这种方式运行。访问控制在类级别而不是对象级别上运行。因此,当Person
使某些内容成为私有时,这意味着只有Person
类中的代码才能操作它,但所讨论的对象无关紧要。
关键是要将对象内部的知识与特定的代码片段隔离开来,而不是确保一个对象不能操纵另一个对象。
不要错误地认为OOP是一套完善的规则。许多不同的语言从OO实现不同的想法,并且它们之间存在差异。如果资源明确地告诉你OO&#34;意味着&#34;任何具体的事情,那么他们会误导你。语言设计师和程序作者可以很好地解释这些内容。
答案 1 :(得分:2)
在C ++中,至少,如果你不能访问同一个类的另一个对象的私有字段,那么你就无法编写复制构造函数,也无法编写大量有用的运算符和其他东西。绕过它的唯一方法是使用公共访问器方法,但是任何人都可以调用访问器方法,而且你的FAR会比现在更差!
如果你考虑一下,C ++和Java都有CLASS级封装,而不是OBJECT级封装。假设同一个类的其他对象(即运行相同方法的其他对象)不会对同一个类的对象做任何过于愚蠢的事情。
答案 2 :(得分:1)
私有字段只能由它们所在的类访问。如果你有2个对象,Person A和Person B,它们都是Person,并且都需要能够被类中的方法操纵。正如其他人所说,保护来自于能够操纵数据的其他类,而不是对象。
所以不,这不是违规行为。