0

1 つのクラスの 2 つのオブジェクトをインスタンス化し、1 つのオブジェクトが他のオブジェクトのプライベート フィールドにアクセスして変更します。これは私的なアクセス制御に違反していると思います。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の両方に、OBJECTレベルのカプセル化ではなく、CLASSレベルのカプセル化があります。同じクラスの他のオブジェクト(つまり、同じメソッドを実行している他のオブジェクト)は、同じクラスのオブジェクトに対してあまり愚かなことをしないと想定されています。

于 2012-07-06T01:19:10.487 に答える
1

プライベート フィールドは、それらが存在するクラスからのみアクセスできます。Person A と Person B の 2 つのオブジェクトがある場合、それらは両方とも Person のものであり、クラス内のメソッドによって操作できる必要があります。他の誰かが言ったように、保護はオブジェクトではなくデータを操作できる他のクラスからのものです。

いいえ、これは違反ではありません。

于 2012-07-06T01:21:48.910 に答える