Зловещий трюк JUnit Date - Как бы вы сделали это в C #? - PullRequest
2 голосов
/ 21 октября 2010

Гойко Адзич опубликовал сегодня в своем блоге информацию о приеме модульного тестирования Стива Фримена, который помог понять, почему сравнение дат в модульном тесте не удалось. Вот сообщение в блоге, описывающее трюк - оно не длинное .

Ключевой частью трюка является этот метод (на Java), который переопределяет ToString () в конкретном экземпляре класса Date .

private Date namedDate(final String name, final Date date) {
    return new Date(date.getTime()){
        @Override
        public String toString() {
            return name;
        }
    };
}

Похоже, что этот метод использует средство языка Java, которое не имеет соответствия в C # (или хотя бы одночто я знаю).Если бы вы могли показать мне, как сделать такой же трюк в C #, это было бы здорово.

1 Ответ

4 голосов
/ 21 октября 2010

Это называется анонимным классом в Java. На самом деле это просто реализация класса без имени, которая переопределяет ToString ()

Вы могли бы иметь то же самое в C # с обычным именованным классом - единственная проблема в том, что DateTime является структурой в C #, поэтому вы не можете наследовать от нее.

C # имеет анонимные типы, но не так, как в Java. В C # вы можете иметь анонимный тип и указывать его свойства, но вы не можете указать какие-либо реализации методов. Поэтому анонимные типы в C # и Java, как правило, используются для разных целей.

Редактировать

Вот пример того, как вы будете делать это в C #, но, как указано выше, вы не можете сделать это на DateTime (или других struct s, или закрытых классах) в C #. Итак, ради примера; Я использую воображаемый класс с именем Token, который имеет единственное строковое свойство «Значение»:

private Token GetNamedToken(Token t, string name)
{
    return new NamedToken {Value = t.Value, Name = name};
}

private class NamedToken : Token
{
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...