new
berarti menghargai tipe REFERENSI Anda (sisi kiri =
), dengan demikian menjalankan metode tipe referensi. Jika metode yang didefinisi ulang tidak memiliki new
kata kunci, ia berlaku seperti itu. Selain itu, itu juga dikenal sebagai warisan non-polimorfik . Yaitu, "Saya membuat metode baru di kelas turunan yang sama sekali tidak ada hubungannya dengan metode apa pun dengan nama yang sama di kelas dasar." - oleh kata Whitaker
override
, yang harus digunakan dengan virtual
kata kunci di kelas dasarnya, berarti menghormati tipe OBJECT Anda (sisi kanan =
), dengan demikian menjalankan metode yang ditimpa terlepas dari jenis referensi. Selain itu, itu juga dikenal sebagai warisan polimorfik .
Cara saya mengingat kedua kata kunci itu saling bertentangan.
override
: virtual
kata kunci harus didefinisikan untuk mengganti metode. Metode yang menggunakan override
kata kunci yang terlepas dari jenis referensi (referensi dari kelas dasar atau kelas turunan) jika itu dipakai dengan kelas dasar, metode kelas dasar berjalan. Kalau tidak, metode kelas turunan berjalan.
new
: jika kata kunci digunakan oleh suatu metode, tidak seperti override
kata kunci, jenis referensi itu penting. Jika itu dipakai dengan kelas turunan dan tipe referensi adalah kelas dasar, metode kelas dasar berjalan. Jika dipakai dengan kelas turunan dan tipe referensi adalah kelas turunan, metode kelas turunan berjalan. Yaitu, ini kontras dengan override
kata kunci. En passant, jika Anda lupa atau menghilangkan untuk menambahkan kata kunci baru ke metode, kompiler berperilaku secara default saat new
kata kunci digunakan.
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";
}
}
Panggilan utama:
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());
Keluaran:
A
B
B
base test
derived test
Contoh kode baru,
Main dengan kode dengan berkomentar satu per satu.
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();
}