new
означає поважати тип СПОСОБ (зліва =
), тим самим використовуючи метод еталонних типів. Якщо у визначеному методі немає 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();
}