0

我实例化一个类的两个对象,一个对象访问和更改另一个对象的私有字段。我认为这违反了私有访问控制。它打破了 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++ 和 Java 的错误吗?如果我错了,请告诉我!

4

3 回答 3

3

这绝对不是任何一种语言的“错误”。它们已经很成熟,并且被设计成以这种方式运行。访问控制在类级别而不是对象级别运行。因此,当Person将某些东西设为私有时,这意味着只有Person类中的代码可以操作它,但所讨论的对象是无关紧要的。

关键是将对象内部的知识隔离到特定的代码片段中,而不是确保一个对象不能操纵另一个对象。

不要错误地认为 OOP 是一套完善的规则。许多不同的语言实现了与OO不同的想法,并且它们之间存在差异。如果某个资源明确地告诉您 OO “意味着”任何特定的东西,那么它们就是在误导您。语言设计者和程序作者有很多可以解释的地方。

于 2012-07-06T01:18:05.450 回答
2

至少在 C++ 中,如果您无法访问同一类的另一个对象的私有字段,那么您就无法编写复制构造函数,也无法编写大量有用的运算符和其他东西。解决它的唯一方法是公共访问器方法,但是任何人都可以调用访问器方法,而你的情况会比现在更糟!

如果你仔细想想,C++ 和 Java 都有 CLASS 级别的封装,而不是 OBJECT 级别的封装。有点假设同一类的其他对象(即运行相同方法的其他对象)不会对同一类的对象做任何太愚蠢的事情。

于 2012-07-06T01:19:10.487 回答
1

私有字段只能由它们所在的类访问。如果您有 2 个对象,Person A 和 Person B,它们都是 Person 的,并且都需要能够被类中的方法操作。正如其他人所说,保护是其他类能够操纵数据,而不是对象。

所以不,这不是违规行为。

于 2012-07-06T01:21:48.910 回答