Что если я подавлю «переопределение»? - PullRequest
1 голос
/ 24 февраля 2010

Я заметил, что компилятор генерирует предупреждение, если я подавляю ключевое слово override / new (Overloads / Shadows). Обычно я устанавливаю необходимое ключевое слово.

Но что, если я забуду это?

// >>>> Case A - not virtual property -
class MyPoint : Point
{
    int X { get; set; } // vs new int X { get; set; }
}

// >>>> Case B - virtual property -
class Foo 
{ 
    virtual int Value { get { return 0; } }
}

class Bar : Foo
{ 
    // vs override/new int Value { get { return 1; } } 
    int Value { get { return 1; } }
}

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

Тогда вы не переопределяете свойство, а создаете новое, как если бы вы использовали ключевое слово new.

Bar x = new Bar();
Foo y = x;
Console.WriteLine(x.Value); // Uses Bar.Value
Console.WriteLine(y.Value); // Uses Foo.Value

Обычно это яснее, когда демонстрируется с помощью методов - в этом случае, даже если вы переопределите, вы все равно получите отдельные поля поддержки в обоих классах, просто одно из полей будет избыточным. Без переопределения у вас есть два вспомогательных поля, и то, какое из них вы получите через свойство, будет зависеть от типа времени компиляции выражения, которое вы используете для доступа к нему.

3 голосов
/ 24 февраля 2010

Если вы забудете override / new, значение будет работать так же, как если бы вы поставили new перед ним.

1 голос
/ 24 февраля 2010

Это зависит от вашей цели. Если вы создаете «новый» метод, вы можете фактически пропустить ключевое слово «new» и просто разобраться с предупреждением. «новое» существует для ясности.

С другой стороны, если вы намерены переопределить унаследованный виртуальный метод, исключение «переопределения» фактически приведет к созданию «нового» метода, а унаследованный метод не будет переопределен.

...