【问题标题】:Examples in Test Driven Development By Example by Kent BeckKent Beck 的测试驱动开发示例
【发布时间】: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语言的冗长,重点突出重点。)

标签: oop tdd private


【解决方案1】:

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

【讨论】:

  • 是否存在特定于实例的隐私?
  • 没有我熟悉的任何语言。
  • 在 Scala 中存在对象私有。看我的回答stackoverflow.com/questions/826592/…
  • 谢谢;我得看看 Scala。
【解决方案2】:

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

【讨论】:

  • 看完答案后,我想知道:他是不是从根本上误解了私人?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      Smalltalk 隐私中的 IIRC 行为符合您的预期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-30
        • 2013-04-22
        • 2010-11-28
        • 2011-09-09
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多