我正在阅读Test Driven Development: By Example,其中一个例子让我烦恼。在第3章(所有人的平等)中,作者在equals
类中创建了一个Dollar
函数来比较两个Dollar
对象:
public boolean equals(Object object)
{
Dollar dollar= (Dollar) object;
return amount == dollar.amount;
}
然后,在下一章(4:隐私)中,他使金额成为美元等级的私人成员。
private int amount;
并且测试通过。这不应该导致equals
方法中的编译器错误,因为该对象可以访问其自己的amount
成员,因为它被限制访问其他Dollar
对象的amount
成员?
//shouldn't dollar.amount be no longer accessable?
return amount == dollar.amount
我是否从根本上误解了private
?
更新 我决定回头手动编写本书,当我进入下一部分(第6章 - Equality For All,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 :(得分:7)
答案 1 :(得分:3)
从根本上误解私人,如果他们是同一个班级,美元可以访问任何美元私人方法。
答案 2 :(得分:3)
修饰符私有类私有,而不是对象私有。
答案 3 :(得分:3)
在Java中,private
表示类私有。在类中,您可以在类的所有实例中访问该字段。
在Scala中还有一个对象私有范围,它写成private[this]
。此外,在其他方面,Scala的范围更加灵活(有关详细信息,请参阅this article)。
但是在Java中没有对象私有范围。
答案 4 :(得分:2)
在C ++系列语言(C ++,Java,C#)中,访问控制仅在类级别。因此private
允许访问该类的任何实例。
IIRC在Smalltalk中的隐私行为与您期望的一样。