2

私はテスト駆動開発を読んでいます:例によって、例の1つが私を悩ませています。第3章(すべての平等)では、作成者は2つのオブジェクトを比較するequals関数をクラスに作成します。DollarDollar

public boolean equals(Object object)
{
    Dollar dollar= (Dollar) object;
    return amount == dollar.amount;
}

次に、次の章(4:プライバシー)で、彼は金額をドルクラスのプライベートメンバーにします。

private int amount;

そしてテストに合格します。オブジェクトは他のオブジェクトのメンバーへのアクセスが制限されているequalsため、オブジェクトは自身のメンバーにアクセスできますが、これによってメソッドでコンパイラエラーが発生することはありませんか?amountDollaramount

//shouldn't dollar.amount be no longer accessable?
return amount == dollar.amount

私は根本的に誤解していprivateますか?

更新 私は戻って本と一緒に手動でコーディングすることにしました。次のパート(第6章-すべての平等、Redux)に到達すると、親クラスに金額をプッシュして保護することになり、アクセスの問題が発生します:

public class Money
{
    protected int amount;
}

public class Dollar : Money
{
    public Dollar(int amount)
    {
        this.amount = amount;
    }
    // override object.Equals
    public override bool Equals(object obj)
    {
        Money dollar = (Money)obj;
        //"error CS1540: Cannot access protected member 'Money.amount'
        // via a qualifier of type 'Money'; the qualifier must be of 
        // type 'Dollar' (or derived from it)" on the next line:
        return amount == dollar.amount;
    }
}

protectedこれは、C#でインスタンスベースであることを意味しますか?

4

5 に答える 5

7

ええ、あなたは基本的にプライベートを誤解しています。プライバシーはクラス固有であり、インスタンス固有ではありません。

于 2009-05-05T19:44:26.143 に答える
3

基本的にプライベートを誤解しているDollarは、同じクラスであれば、どのDollarプライベートメソッドにもアクセスできます。

于 2009-05-05T19:44:53.570 に答える
3

修飾子privateは、object- privateではなくclass- privateです。

于 2009-05-05T19:46:34.407 に答える
3

Javaでは、privateクラスプライベートを意味します。クラス内では、クラスのすべてのインスタンスでそのフィールドにアクセスできます。

Scalaには、と書かれたオブジェクトプライベートスコープもありますprivate[this]。また、他の点でも、Scalaのスコープはより柔軟です(詳細については、この記事を参照してください)。

しかし、Javaにはオブジェクトプライベートスコープはありません。

于 2009-05-05T19:54:08.570 に答える
2

C ++ファミリの言語(C ++、Java、C#)では、アクセス制御はクラスレベルでのみ行われます。したがって private、そのクラスの任意のインスタンスへのアクセスを許可します。

SmalltalkプライバシーのIIRCは、期待どおりに動作します。

于 2009-05-05T19:50:29.373 に答える