new
означает уважение к вашему типу REFERENCE (слева =
), тем самым запустив метод ссылочных типов. Если переопределенный метод не имеет new
ключевого слова, он ведет себя как есть. Кроме того, это также известно как неполиморфное наследование . То есть «я делаю совершенно новый метод в производном классе, который не имеет абсолютно никакого отношения к каким-либо методам с тем же именем в базовом классе». - сказал Уитакер
override
, который должен использоваться с virtual
ключевым словом в его базовом классе, означает уважать ваш тип OBJECT (правая часть =
), тем самым запуская метод, переопределяемый независимо от ссылочного типа. Кроме того, это также известно как полиморфное наследование .
Мой способ запомнить оба ключевых слова, чтобы они были противоположны друг другу.
override
: virtual
ключевое слово должно быть определено для переопределения метода. Метод, использующий override
ключевое слово, которое независимо от типа ссылки (ссылка на базовый класс или производный класс), если оно создается с помощью базового класса, запускает метод базового класса. В противном случае метод производного класса запускается.
new
: если ключевое слово используется методом, в отличие от override
ключевого слова, тип ссылки важен. Если он создан с производным классом, а ссылочный тип является базовым классом, выполняется метод базового класса. Если он создается с производным классом, а ссылочный тип является производным классом, выполняется метод производного класса. А именно, это контраст override
ключевого слова. Если вы забудете или не добавите новое ключевое слово в метод, компилятор будет работать по умолчанию, так как new
используется ключевое слово.
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
Звоните в основном:
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
Вывод:
A
B
B
base test
derived test
Новый пример кода,
Играйте с кодом, комментируя по одному.
class X
{
protected internal /*virtual*/ void Method()
{
WriteLine("X");
}
}
class Y : X
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Y");
}
}
class Z : Y
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Z");
}
}
class Programxyz
{
private static void Main(string[] args)
{
X v = new Z();
//Y v = new Z();
//Z v = new Z();
v.Method();
}