我正在阅读测试驱动开发:示例和一个这些例子让我烦恼。在第3章(所有人的平等)中,作者在 Dollar 类中创建了一个 equals 函数来比较两个 Dollar 对象:

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

然后,在下一章(4:隐私)中,他使金额成为美元等级的私人成员。

private int amount;

并且测试通过。这不应该导致 equals 方法中的编译器错误,因为该对象可以访问自己的 amount 成员,因为它被限制访问其他 Dollar object的 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#?

有帮助吗?

解决方案

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

其他提示

从根本上误解私人,如果他们是同一个班级,美元可以访问任何美元私人方法。

修饰符私有类私有,而不是对象私有。

在Java中, private 表示class-private。在类中,您可以在类的所有实例中访问该字段。

在Scala中还有一个对象私有作用域,它写成 private [this] 。另外在其他方面,Scala的范围更灵活(参见这篇文章了解更多信息)。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top