2009-05-05 5 views
2

私はTest Driven Development: By Exampleを通して読んでおり、その1つの例は私を悩ませています。次の章では、次に例によるテスト駆動開発例Kent Beck著

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

:第3章(すべてのための平等)で、著者はDollarクラスのequals関数は、2つのDollarオブジェクトを比較するために作成されます(4:個人情報保護)、彼は額にプライベートメンバーになりますドルクラスの

private int amount; 

となります。オブジェクトが他のDollarオブジェクトのamountメンバにアクセスすることを制限されているため、オブジェクトが自身のamountメンバにアクセスできる間、これはequalsメソッドでコンパイラエラーを引き起こしませんか?

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

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

UPDATE 私は手動での本と一緒に戻って、コード行くことにしたと、私は次の部分(第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#でのインスタンス・ベースであることを意味するのでしょうか?

+0

私は本を読んだことはありませんが、金額の会員に公にアクセス可能な物件を作った可能性はありますか? – TheTXI

+0

@TheTXI:Javaにはプロパティがありません。正確な変更は、パッケージプライベートフィールド( 'int amount;')であったもので、プライベートフィールド( 'private int amount;')に変更されました。 (私はなぜKentがpublicではなくpackage-privateを使うのか分かりません.Java言語の冗長さを減らし、主なポイントに焦点を当てるだけかもしれません) –

答えて

7

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

+0

インスタンス固有のプライバシーが存在しますか? – brian

+0

私はよく知っている言語ではありません。 –

+1

Scalaではobject-privateが存在します。私の答えhttp:// stackoverflowを見てください。com/questions/826592 /馬鹿馬鹿しい質問の例 - テストドリブン - 開発 - by-by-kent-beck/826638#826638 –

3

ドルはプライベートであると誤解しています。ドルは、同じクラスのドルプライベートメソッドにアクセスできます。

+0

答えを読んだ後、私は不思議に思っています。彼は根本的に私的な誤解ですか? – Pesto

3

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

2

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

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

3

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

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

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

関連する問題