質問

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

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

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

private int amount;

そしてテストに合格します。これは、オブジェクトが他の Dollar amount メンバーにアクセスできるため、 equals メソッドでコンパイラエラーを引き起こしてはなりません。 code>オブジェクトの amount メンバー?

//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#のインスタンスベースであることを意味しますか?

役に立ちましたか?

解決

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

他のヒント

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

修飾子privateは、 class-private であり、object-privateではありません。

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

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

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

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

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

scroll top