4

どの OOP 言語にもobject-privateの概念はありますか?? 古典的なプライベートアクセスよりも制限が厳しいということですか?

Private (または class-private) は、クラス自体へのアクセスを制限します。同じクラスの一部であるメソッドのみがプライベート メンバーにアクセスできます。

object-private :オブジェクト自体へのアクセスを制限します。メンバーにアクセスできるメソッド オブジェクトのみが記述できません。

public class Person {

private String secret;
public String othersSecret;

public void snoop(Person p) {
    othersSecret = p.secret; //will be prohibited by the compiler
}

編集 :

存在する場合、いくつかの例を教えていただけますか...そうでない場合、この種の機能を持つことは興味深いと思いますか?? 他のOOP言語でシミュレートすることは可能ですか??

EDIT 2: ありがとう、すべての答えは非常に有益でした...

これまでの暫定的な結論:

インスタンス プライベートの概念は、次の 2 つの言語に存在します。

1 - 何時間もグーグル検索した後の Smalltalk :) この概念の背後にある言語を見つけました !!

オブジェクトが保持する状態は、常にそのオブジェクトに対して非公開です。他のオブジェクトは、要求 (メッセージ) をオブジェクトに送信することによってのみ、その状態を照会または変更できます。

2 - LoganのおかげでRuby :

ある人は、C++ では「プライベート」は「このクラスに対してプライベート」を意味し、Ruby では「このインスタンスに対してプライベート」を意味すると言って、これらの違いをまとめました。つまり、クラス A のコードから C++ では、タイプ A の他のオブジェクトのプライベート メソッドにアクセスできます。Ruby ではできません。オブジェクトのインスタンスのプライベート メソッドにのみアクセスでき、他のインスタンスにはアクセスできません(クラス A の) オブジェクト インスタンス。

4

7 に答える 7

3

ruby では、オブジェクトごとのプライベートが唯一のプライベートです (protectedクラスのプライベートな動作を得るために使用する必要があります)。

例: foo.rb:

 class A
    private
    def a=(x)
            @a=x
    end
    public
    def a
            @a
    end

    def b(c)
            c.a = 2
    end
 end

 a1 = A.new
 a2 = A.new
 a1.b(a2)

それを実行すると、得られます

 foo.rb:12:in `b': private method `a=' called for #<A:0xb7c9b6e0> (NoMethodError)
    from foo.rb:18

もちろん、これを回避する方法はありますが、ほとんどの場合、回避策があります。

于 2009-12-28T17:34:34.940 に答える
2

あなたが望む機能は、比喩的に言えば、人が直接通信できないようにすることで実装できると思います。最小限の労力でこれを実現するには、秘密にしたいものへのアクセスを提供しないインターフェイスを導入できます。

public interface IPerson
{
    void communicateFormally();
}

public class Person : IPerson 
{
    private String secret;
    public String othersSecret;

    public void snoop(IPerson p) {
      othersSecret = p.secret; //will be prohibited by the compiler
    }
    ...
}

さて、これは醜いキャストによって「ハッキング」される可能性がありますが、それは1つのハッキングの問題だと思います.

于 2009-12-28T17:16:22.307 に答える
1

あなたが書いているように見えるJavaでは、「プライベート」はクラスプライベートを意味します。object-private モードを強制する方法はありません。この理由は、「プライベート」はカプセル化を強制する方法であり、セキュリティではないためです。

于 2009-12-28T16:59:20.533 に答える
0

この種のクラスとオブジェクトの区別はprivate、C#、C++、Python、Java、Objective-C などの最も一般的な言語 OO には存在しないと思います。公平を期すために、実際にこの機能。

于 2009-12-28T16:58:19.177 に答える
0

はい、そのインターフェースの他のインスタンスが見ることができないインスタンス変数を含むオブジェクトを Java で作成できます。些細な例:

class Secretive { }
Secretive s = new Secretive() {
    int unknowable = 42;
};
Secretive t = new Secretive() {
    String unfathomable = "banana";
};
于 2009-12-28T17:04:51.680 に答える
0
    public class Person
    {
        private String privateSecret;
        public String PublicInformation;

        public void Snoop(Person p)
        {
            // will be allowed by the .NET compiler
            p.PublicInformation = p.privateSecret;
        }
    }

プロパティまたは読み取り専用フィールドを使用して、セキュリティを強化してください

内部アクセサーを使用して、クラスを assambley にカプセル化することもできます。

このような拒否テクニックを使用することもできます。

于 2009-12-28T17:12:48.040 に答える