Hayır, sanal olmayan bir yöntemi geçersiz kılamazsınız. Yapabileceğiniz en yakın şey new
, aynı isimde bir yöntem oluşturarak yöntemi gizlemektir, ancak bu, iyi tasarım ilkelerini ihlal ettiği için tavsiye edilmez.
Ancak bir yöntemi gizlemek bile size gerçek bir sanal yöntem çağrısının yapacağı gibi yöntem çağrılarının yürütme zamanı polimorfik gönderimini vermez. Şu örneği düşünün:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
Bu örnekte her iki M
yöntem de print yöntemini çağırmaktadır Foo.M
. Bu yaklaşımı görebileceğiniz gibi bu nesneye referans doğru türetilmiş bir tür olmasına karşın taban yöntemi gizleme olduğu sürece bir yöntem için yeni bir uygulama kullanmasına olanak tanır yapar mola polimorfizmi.
Temel yöntemleri bu şekilde gizlememenizi tavsiye ederim.
Yöntemlerin varsayılan olarak sanal olmadığı (Java'nın aksine) C # 'ın varsayılan davranışını destekleyenlerin yanında olma eğilimindeyim. Daha da ileri gidip sınıfların da varsayılan olarak mühürlenmesi gerektiğini söylerdim. Kalıtımın doğru bir şekilde tasarlanması zordur ve sanal olarak işaretlenmemiş bir yöntemin varlığı, bu yöntemin yazarının yöntemin geçersiz kılınmasını asla amaçlamadığını gösterir.
Düzenleme: "yürütme zamanı polimorfik gönderme" :
Bununla kastettiğim, sanal yöntemleri çağırdığınızda yürütme sırasında meydana gelen varsayılan davranıştır. Diyelim ki önceki kod örneğimde sanal olmayan bir yöntemi tanımlamak yerine, aslında bir sanal yöntem ve gerçek bir geçersiz kılınan yöntem tanımladım.
Bu b.Foo
durumda arayacak olsaydım , CLR b
referansın işaret ettiği nesne türünü doğru bir şekilde belirler Bar
ve çağrıyı M
uygun şekilde gönderir .