Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C# dili, farklı kitaplıklardaki temel ve türetilmiş sınıflar arasında sürüm oluşturmanın gelişebilmesi ve geriye dönük uyumluluğu koruyabilmesi için tasarlanmıştır. Bu, örneğin, türetilmiş bir sınıftaki üyeyle aynı ada sahip bir temel sınıfa yeni bir üyenin eklenmesinin C# tarafından tamamen desteklendiği ve beklenmeyen davranışlara yol açmadığı anlamına gelir. Ayrıca bir sınıfın, bir yöntemin devralınan bir yöntemi geçersiz kılmaya yönelik olup olmadığını veya yöntemin benzer adlandırılmış devralınan bir yöntemi gizleyen yeni bir yöntem olup olmadığını açıkça belirtmesi gerektiği anlamına gelir.
C# dilinde türetilmiş sınıflar, temel sınıf yöntemleriyle aynı ada sahip yöntemler içerebilir.
Türetilmiş sınıftaki metottan önce new veya override anahtar sözcükleri yoksa, derleyici bir uyarı yayınlar ve metot, anahtar kelimesi mevcutmuş gibi davranır.
Türetilmiş sınıftaki yöntemin
new
başında anahtar sözcüğü varsa, yöntemi temel sınıftaki yöntemden bağımsız olarak tanımlanır.Türetilmiş sınıftaki yöntemin
override
önünde anahtar sözcüğü varsa, türetilmiş sınıfın nesneleri temel sınıf yöntemi yerine bu yöntemi çağırır.Anahtar sözcüğünü
override
türetilmiş sınıftaki yöntemine uygulamak için temel sınıf yönteminin sanal olarak tanımlanması gerekir.Temel sınıf yöntemi, anahtar sözcüğü kullanılarak türetilmiş sınıfın
base
içinden çağrılabilir.override
,virtual
venew
anahtar sözcükleri özelliklere, dizin oluşturuculara ve olaylara da uygulanabilir.
Varsayılan olarak, C# yöntemleri sanal değildir. Bir yöntem sanal olarak bildirilirse, yöntemini devralan herhangi bir sınıf kendi sürümünü uygulayabilir. Bir yöntemi sanal yapmak için değiştirici, virtual
temel sınıfın yöntem bildiriminde kullanılır. Türetilmiş sınıf daha sonra anahtar sözcüğünü kullanarak temel sanal yöntemi geçersiz kılabilir veya anahtar sözcüğünü kullanarak override
new
temel sınıftaki sanal yöntemi gizleyebilir.
override
Anahtar sözcük veya new
anahtar sözcük belirtilmezse, derleyici bir uyarı yayınlar ve türetilmiş sınıftaki yöntemi temel sınıftaki yöntemi gizler.
Bunu uygulamada göstermek için, bir an için A Şirketinin programınızın kullandığı adlı GraphicsClass
bir sınıf oluşturduğunu varsayalım. Aşağıdakiler şunlardır GraphicsClass
:
class GraphicsClass
{
public virtual void DrawLine() { }
public virtual void DrawPoint() { }
}
Şirketiniz bu sınıfı kullanır ve yeni bir yöntem ekleyerek kendi sınıfınızı türetmek için bu sınıfı kullanırsınız:
class YourDerivedGraphicsClass : GraphicsClass
{
public void DrawRectangle() { }
}
Şirket A, aşağıdaki koda benzeyen yeni bir sürümünü GraphicsClass
yayınlayana kadar uygulamanız sorunsuz bir şekilde kullanılır:
class GraphicsClass
{
public virtual void DrawLine() { }
public virtual void DrawPoint() { }
public virtual void DrawRectangle() { }
}
GraphicsClass
öğesinin yeni sürümü, DrawRectangle
adlı bir yöntem içeriyor. Başlangıçta hiçbir şey gerçekleşmez. Yeni sürüm, eski sürümle hala ikili uyumlu. Dağıttığınız tüm yazılımlar, yeni sınıf bu bilgisayar sistemlerinde yüklü olsa bile çalışmaya devam eder. yöntemine DrawRectangle
yapılan tüm mevcut çağrılar, türetilmiş sınıfınızdaki sürümünüze başvurmaya devam eder.
Ancak, uygulamasını yeni sürümünü GraphicsClass
kullanarak yeniden derlediğiniz anda, derleyici olan CS0108'den bir uyarı alırsınız. Bu uyarı, yönteminizin uygulamanızda nasıl davranmasını istediğinizi düşünmeniz DrawRectangle
gerektiğini size bildirir.
Yönteminizin yeni temel sınıf yöntemini geçersiz kılmasını istiyorsanız anahtar sözcüğünü override
kullanın:
class YourDerivedGraphicsClass : GraphicsClass
{
public override void DrawRectangle() { }
}
override
anahtar sözcüğü, öğesinden YourDerivedGraphicsClass
türetilen tüm nesnelerin türetilmiş sınıf sürümünü DrawRectangle
kullanmasını sağlar. öğesinden YourDerivedGraphicsClass
türetilen nesneler, temel anahtar sözcüğünü kullanarak temel sınıf sürümüne DrawRectangle
erişmeye devam edebilir:
base.DrawRectangle();
Yönteminizin yeni temel sınıf yöntemini geçersiz kılmasını istemiyorsanız, aşağıdaki önemli noktalar geçerlidir. İki yöntem arasındaki karışıklığı önlemek için yönteminizi yeniden adlandırabilirsiniz. Bu, zaman alıcı ve hataya eğilimli olabilir ve bazı durumlarda pratik değildir. Ancak, projeniz görece küçükse, visual studio'nun Yeniden düzenleme seçeneklerini kullanarak yöntemi yeniden adlandırabilirsiniz. Daha fazla bilgi için bkz. Sınıfları ve Türleri Yeniden Düzenleme (Sınıf Tasarımcısı).
Alternatif olarak, türetilmiş sınıf tanımınızda anahtar sözcüğünü new
kullanarak uyarıyı engelleyebilirsiniz:
class YourDerivedGraphicsClass : GraphicsClass
{
public new void DrawRectangle() { }
}
anahtar sözcüğünü new
kullanmak derleyiciye tanımınızın temel sınıfta yer alan tanımı gizlediğini bildirir. Bu, varsayılan davranıştır.
Geçersiz Kılma ve Yöntem Seçimi
Bir yöntem bir sınıfta adlandırıldığında, C# derleyicisi çağrıyla uyumlu birden fazla yöntem varsa çağrılabilecek en iyi yöntemi seçer; örneğin, aynı ada sahip iki yöntem ve geçirilen parametreyle uyumlu parametreler olduğunda. Aşağıdaki yöntemler uyumlu olabilir:
public class Derived : Base
{
public override void DoWork(int param) { }
public void DoWork(double param) { }
}
DoWork
bir Derived
örneğinde çağrıldığında, C# derleyicisi ilk olarak çağrıyı DoWork
üzerinde başlangıçta bildirilen Derived
sürümleriyle uyumlu hale getirmeye çalışır. Geçersiz kılma yöntemleri bir sınıfın üzerinde bildirilmiş olarak kabul edilmez; bunlar, temel sınıfta bildirilen bir yöntemin yeni uygulamalarıdır. C# derleyicisi yalnızca Derived
üzerindeki bir özgün yöntemle yöntem çağrısını eşleştiremezse, çağrıyı aynı ada ve uyumlu parametrelere sahip geçersiz kılınmış bir yöntemle eşleştirmeye çalışacaktır. Örneğin:
int val = 5;
Derived d = new();
d.DoWork(val); // Calls DoWork(double).
Değişkeni val
örtük olarak çifte dönüştürülebildiğinden C# derleyicisi DoWork(double)
yerine öğesini çağırırDoWork(int)
. Bunu önlemenin iki yolu vardır. İlk olarak, sanal yöntemlerle aynı ada sahip yeni yöntemler bildirmekten kaçının. İkinci olarak, Derived
örneğini Base
'ye dönüştürerek temel sınıf yöntem listesinde arama yapmasını sağlayarak, C# derleyicisine sanal yöntemi çağırmasını talimat verebilirsiniz. yöntem sanal olduğundan, DoWork(int)
üzerindeki Derived
uygulaması çağrılacaktır. Örneğin:
((Base)d).DoWork(val); // Calls DoWork(int) on Derived.
new
ve override
hakkında daha fazla örnek için, Geçersiz Kılma ve Yeni Anahtar Sözcüklerin Ne Zaman Kullanılacağını Bilmek bölümüne bakınız.