new
REFERANS türünüze (sol taraf =
) saygı göstererek, başvuru türlerinin yöntemini çalıştırmayı ifade eder. Yeniden tanımlı yöntemin new
anahtar sözcüğü yoksa , olduğu gibi davranır. Ayrıca, polimorfik olmayan kalıtım olarak da bilinir . Yani, “Türetilmiş sınıfta, taban sınıfta aynı ada sahip herhangi bir yöntemle kesinlikle ilgisi olmayan yepyeni bir yöntem yapıyorum.” - dedi Whitaker
override
, virtual
temel sınıfında anahtar kelime ile kullanılması gereken , OBJECT türünüze (sağ tarafı =
) saygı gösterilmesi anlamına gelir , böylece başvuru türünden bağımsız olarak çalıştırma yöntemi geçersiz kılınır. Ayrıca, polimorfik kalıtım olarak da bilinir .
Aklımda iki anahtar kelime birbirlerinin zıt olduğunu unutmayın.
override
: virtual
yöntemi geçersiz kılmak için anahtar kelime tanımlanmalıdır. Yöntemi kullanarakoverride
Temel sınıfla başlatılırsa, başvuru türünden (temel sınıf veya türetilmiş sınıf başvurusu) bağımsız olarak anahtar sözcük yöntem, temel sınıf yöntemi çalışır. Aksi takdirde, türetilmiş sınıf yöntemi çalışır.
new
: anahtar kelime bir yöntem tarafından kullanılıyorsa, anahtar kelimenin aksine override
, başvuru türü önemlidir. Türetilmiş sınıfla başlatılırsa ve başvuru türü temel sınıfsa, temel sınıf yöntemi çalışır. Türetilmiş sınıfla başlatılırsa ve başvuru türü türetilmiş sınıfsa, türetilmiş sınıf yöntemi çalışır. Yani, override
anahtar kelimenin kontrastıdır . Geçtiğinde, yönteme yeni anahtar kelime eklemeyi unutursanız veya atlarsanız, derleyici varsayılan olarak new
anahtar sözcük kullanıldıkça davranır .
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";
}
}
Ana çağrı:
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());
Çıktı:
A
B
B
base test
derived test
Yeni kod örneği,
Kodları tek tek yorumlayarak oynayabilirsiniz.
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();
}