【发布时间】:2010-10-24 00:27:07
【问题描述】:
我正在阅读Test Driven Development: By Example,其中一个例子让我很烦。在第 3 章(人人平等)中,作者在Dollar 类中创建了一个equals 函数来比较两个Dollar 对象:
public boolean equals(Object object)
{
Dollar dollar= (Dollar) object;
return amount == dollar.amount;
}
然后,在下一章(4:隐私)中,他将 amount 设为 Dollar 类的私有成员。
private int amount;
并且测试通过了。这不应该导致equals 方法中的编译器错误,因为虽然对象可以访问其自己的amount 成员,因为它被限制访问其他Dollar 对象的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# 中是基于实例的?
【问题讨论】:
-
这本书我没看过,但是有没有可能他为amount会员做了一个公开的财产?
-
@TheTXI:Java 没有属性。确切的变化是该数量曾经是包私有字段(
int amount;),它被更改为私有字段(private int amount;)。 (不知道为什么Kent在书中使用package-private而不是public。可能只是为了减少Java语言的冗长,重点突出重点。)