代码之家  ›  专栏  ›  技术社区  ›  Brian

KentBeck的测试驱动开发示例

  •  2
  • Brian  · 技术社区  · 17 年前

    我正在看完 Test Driven Development: By Example 其中一个例子就是骚扰我。在第三章(人人平等)中,作者创造了 equals 功能在 Dollar 要比较的类 美元 物体:

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

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

    private int amount;
    

    测试通过了。这是否会导致 等于 方法,因为对象可以访问自己的 amount 成员,因为它被限制访问另一个 美元 对象的 数量 成员?

    //shouldn't dollar.amount be no longer accessable?
    return amount == dollar.amount
    

    我基本上是不是误解了 private ?

    更新 我决定手动返回并与本书一起编写代码,当我进入下一部分(第6章-人人平等,redux)时,它们将amount推入父类并使其受到保护,我遇到了访问问题:

    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?

    5 回复  |  直到 13 年前
        1
  •  7
  •   Carl Manaster    17 年前

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

        2
  •  3
  •   roh    17 年前

    从根本上误解了private,如果它们是同一类,那么dollar可以访问任何dollar private方法。

        3
  •  3
  •   mats    17 年前

    修饰符private是 阶级私立 ,不是对象私有。

        4
  •  3
  •   Esko Luontola    17 年前

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

    在scala中,还有一个对象私有作用域 private[this] . 另外,在其他方面,scala的范围更灵活(参见 this article 更多信息)。

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

        5
  •  2
  •   Pete Kirkham    17 年前

    在C++语言(C++,爪哇,C语言)中,访问控制只在类级别。所以 private 允许访问该类的任何实例。

    iIRC在Smalltalk中的隐私行为如您所料。

    推荐文章