Aracılığıyla paylaş


Geçersiz Kılma ve Yeni Anahtar Sözcüklerle Sürüm Oluşturma (C# Programlama Kılavuzu)

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, virtualve new 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 overridenew 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ı GraphicsClassbir 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ü GraphicsClassyayı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ü GraphicsClasskullanarak 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ü DrawRectanglekullanması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.

Ayrıca bkz.