Примеры в тестовой разработке на примере Кента Бека - PullRequest
2 голосов
/ 05 мая 2009

Я читаю Разработка через тестирование: по примеру , и один из примеров меня беспокоит. В главе 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?

UPDATE Я решил вернуться и написать код вместе с книгой вручную, и когда я перешел к следующей части (глава 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 #?

Ответы [ 5 ]

7 голосов
/ 05 мая 2009

Да, вы в корне неправильно понимаете личное. Конфиденциальность зависит от класса, а не от экземпляра.

3 голосов
/ 05 мая 2009

В Java private означает закрытый класс. Внутри класса вы можете получить доступ к этому полю во всех экземплярах класса.

В Scala есть также объектно-частная область видимости, написанная private[this]. Также в других отношениях возможности Scala более гибкие (см. эту статью для получения дополнительной информации).

Но в Java нет объектно-частной области видимости.

3 голосов
/ 05 мая 2009

Модификатор private - class-private , а не object-private.

3 голосов
/ 05 мая 2009

Принципиально неправильно понимая приватность, Dollar может получить доступ к любому приватному методу Dollar, если они одного класса.

2 голосов
/ 05 мая 2009

В языках семейства C ++ (C ++, Java, C #) управление доступом осуществляется только на уровне класса. Таким образом, private разрешает доступ к любому экземпляру этого класса.

IIRC в конфиденциальности Smalltalk ведет себя так, как вы ожидаете.

...