То, что вы делаете, это не переопределение, а затенение.Ключевое слово new
позволяет вам иметь метод Display
в обоих классах BC
и DC
, но методы вообще не связаны, они просто имеют одно и то же имя.
Чтобы переопределитьметод, вам нужно будет использовать ключевое слово virtual
для метода в классе BC
и метод overrides
в классе DC
.
Когда вы создаете теневой метод, это типссылки, которая решает, какой метод используется:
BC b1;
b1 = new BC();
b1.Display(); // Calls the method in BC
BC b2;
b2 = new DC();
b2.Display(); // Calls the method in BC
DC d1;
d1 = new DC();
d1.Display(); // Calls the method in DC
Переопределение метода выглядит следующим образом:
class BC {
public virtual void Display() {
System.Console.WriteLine("BC::Display");
}
}
class DC : BC {
override public void Display() {
System.Console.WriteLine("DC::Display");
}
}
При переопределении метода методы связаны, и это фактический типобъекта, который решает, какой метод использовать, а не тип ссылки:
BC b1;
b1 = new BC();
b1.Display(); // Calls the method in BC
BC b2;
b2 = new DC();
b2.Display(); // Calls the method in DC
DC d1;
d1 = new DC();
d1.Display(); // Calls the method in DC
Еще одно различие между переопределением и затенением заключается в том, что при затенении метода совсем не обязательно быть похожимключевое слово new
просто сообщает компилятору, что вы хотите повторно использовать идентификатор для чего-то другого, чем в базовом классе.При переопределении метода сигнатуры метода должны быть одинаковыми.
Например, вы можете скрывать открытый метод, который принимает string
, с чем-то совершенно другим, например, с частным свойством типа int
:
public class X {
public void XX(string z) { }
}
public class Y : X {
private new int XX { get; set; }
}
X x = new Y();
x.XX();
Y y = new Y();
y.XX = 42;