質問
テスト駆動開発:例および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は、期待どおりに動作します。