2016-05-03 3 views
2

Учитывая, что у меня есть следующий код:C#: Можно ли скрывать реализацию по наследству?

interface IBase { 
    void DoStuff(double x, double y); 
} 

class Base : IBase { 
    public void DoStuff(double x, double y) { Console.WriteLine(x + y); } 
} 

это хорошая практика, чтобы переопределить/скрыть поведение базового класса без фактического использования override ключевого слова? Есть ли скрытые подводные камни в коде ниже?

class Derived : Base { 
    public void DoStuff(double x, double y) { Console.WriteLine(x * y); } 
} 

Лучше ли использовать здесь ключевое слово new? Как так:

class Derived : Base { 
    public new void DoStuff(double x, double y) { Console.WriteLine(x * y); } 
} 
+2

[Полезный материал здесь] (http://stackoverflow.com/q/6576206/301857). Поведение по умолчанию - «новое», поэтому единственная ошибка - это код, который может вводить в заблуждение. –

+1

'public void DoStuff' и' public new void DoStuff' имеют 0 отличий в поведении, кроме первого, выдает предупреждение компилятора, а второе - нет. –

ответ

5

Это хорошая практика, чтобы переопределить/скрыть поведение базового класса, фактически используя переопределения ключевое слово?

Вы не можете «переопределить» базовый метод, потому что это не virtual. Все вы может сделать это скрыть. Это очень редко «хорошая практика», но нет ничего, что мешает ей, так ли это «хорошо» или нет, очень контекстуально.

Полезно ли использовать здесь новое ключевое слово?

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

+0

Было бы лучше, если бы я изменил код, чтобы определить метод как виртуальный в базе? проблема здесь должна быть «class BaseB: IBase», нет способа принудительно объявить метод как виртуальный. – mbadawi23

+0

Вы можете сделать его «абстрактным», чтобы заставить наследователей предоставить свою собственную реализацию, но нет способа «заставить» класс сделать метод «virtual» –

+0

Отлично, это именно то, что я искал. Не могли бы вы включить это и в свой ответ. Благодарю. – mbadawi23