2

我正在阅读测试驱动开发:通过示例,其中一个示例困扰着我。在第 3 章(人人平等)中,作者equals在类中创建了一个函数Dollar来比较两个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# 中是基于实例的?

4

5 回答 5

7

是的,你从根本上误解了私人。隐私是特定于类的,而不是特定于实例的。

于 2009-05-05T19:44:26.143 回答
3

从根本上误解了私有,如果它们是同一个类,Dollar 可以访问任何 Dollar 私有方法。

于 2009-05-05T19:44:53.570 回答
3

修饰符 private 是class-private,而不是 object-private。

于 2009-05-05T19:46:34.407 回答
3

在 Java 中,private意味着类私有。在类中,您可以在类的所有实例中访问该字段。

在 Scala 中还有一个对象私有作用域,写成private[this]. 此外,在其他方面,Scala 的作用域更加灵活(有关更多信息,请参阅本文)。

但是在 Java 中没有对象私有范围。

于 2009-05-05T19:54:08.570 回答
2

在 C++ 系列语言(C++、Java、C#)中,访问控制仅在类级别。因此 private允许访问该类的任何实例。

Smalltalk 隐私中的 IIRC 的行为与您期望的一样。

于 2009-05-05T19:50:29.373 回答