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 tasarlanmış böylece sürüm arasında temel ve türetilmiş sınıflar farklı kitaplıklarda geliştirin ve geriye doğru uyumluluk sağlayacak.Bu, örneğin, anlamına gelir yeni üyesi temel giriş sınıf üyesi türetilmiş bir sınıf içinde aynı adla tamamen C# tarafından desteklenir ve beklenmeyen bir davranışa yol değil.Ayrıca gelir yöntem olup, sınıf açıkça belirtmelidir geçersiz kılmak yöntemmiras alınan bir amacı veya yöntemmiras yöntem gizler benzer biçimde adlandırılmış yeni bir yöntem olup olmadığı.

C# [NULL]'ta yöntemler taban sınıf yöntemlerini aynı adla türetilmiş sınıflar içerebilir.

  • Temel sınıfyöntem tanımlanmalıdır sanal.

  • Türetilmiş sınıf yöntem tarafından önünde değil, Yeni veya geçersiz kılmak anahtar sözcükler, derleyici verecek bir uyarı ve yöntem davranır gibi new anahtar sözcük yok.

  • Türetilmiş sınıf yöntem ile öncesinde, new anahtar sözcük, yöntem temel sınıf yöntem bağımsız olacak şekilde tanımlanır.

  • Türetilmiş sınıf yöntem ile öncesinde, override anahtar sözcük, türetilmiş bir sınıf nesneleri temel sınıfyöntemyerine o yöntem çağırmak.

  • Temel sınıfyöntem alanından türetilmiş sınıf kullanma içinde çağrılabilir base anahtar sözcük.

  • override, virtual, Ve new anahtar sözcükler de uygulanabilir özellikler, dizinleyiciler ve olaylar.

Varsayılan olarak, C# yöntemleri sanal değildir.Bir yöntem sanal olarak bildirilirse, herhangi bir sınıf yöntem devralmasını kendi sürümuygulayabilirsiniz.Sanal bir yöntem sağlamak için virtual değiştirici içinde temel sınıfbildirim yöntemkullanılır. Türetilmiş bir sınıf olabilir sonra temel sanal bir yöntem geçersiz kılmak ' ni kullanarak override anahtar sözcük ya da Gizle kullanarak temel sınıf yöntem sanal new anahtar sözcük. Hiçbiri, override anahtar sözcük ya da new anahtar sözcük belirtilirse, derleyici uyarı verecek ve türetilmiş sınıf yöntem , temel sınıf yöntem gizlenir.

Bu uygulamada göstermek için bir süre Şirket a adında bir sınıf oluşturulması gerektiğini varsayalım GraphicsClass, hangi program kullanır.Aşağıdaki GraphicsClass:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
}

Bu sınıfşirketinizin kullandığı ve kendi sınıf, yeni bir yöntemekleme türetmek için kullanın:

class YourDerivedGraphicsClass : GraphicsClass
{
    public void DrawRectangle() { }
}

Şirket a, yeni bir sürüm bırakmadan uygulama sorunları kullanılan GraphicsClass, aşağıdaki kod benzer:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
    public virtual void DrawRectangle() { }
}

Yeni sürüm , GraphicsClass şimdi adındaki bir yöntem içeren DrawRectangle.Başlangıçta, hiçbir şey olmaz.Yeni sürüm hala ikili eski sürümile uyumlu değildir.Yeni bir sınıf bu bilgisayar sistemlerinde yüklü olsa bile dağıtmış olan herhangi bir yazılım çözüm bulmak, devam edecektir.Varolan aramaların yöntem DrawRectangle sürüm, bilgisayarınızın türetilmiş bir sınıfiçinde başvuruda bulunmaya devam eder.

Ancak, sürede uygulama ' ın yeni sürüm kullanarak derlemeniz gibi GraphicsClass, derleyiciCS0108 bir uyarı alırsınız.Bu uyarı nasıl istediğinizi düşünün gerektiğini bildirir, DrawRectangle uygulamadavranmaya yöntem .

Sizin yöntem yeni bir temel sınıfyöntem geçersiz kılmak ' ni isterseniz, override anahtar sözcük:

class YourDerivedGraphicsClass : GraphicsClass
{
    public override void DrawRectangle() { }
}

override anahtar sözcük yaptığı tüm nesneler tarafından türetilen emin YourDerivedGraphicsClass , türetilmiş bir sınıfsürüm kullanacağı DrawRectangle. Nesneleri türetilen YourDerivedGraphicsClass , temel sınıfsürüm erişmeye devam edebilirsiniz DrawRectangle temel anahtar sözcükkullanarak:

base.DrawRectangle();

Sizin için yeni bir temel sınıfyöntem, aşağıdaki konuları uygulamak geçersiz kılmak ' ni yöntem istemiyorsanız. İki yöntem arasındaki karışıklığı önlemek için kendi yöntemyeniden adlandırabilirsiniz.Bu zaman alıcı olabilir ve hata-saldırıya ve bazı durumlarda pratik değilim.Görece küçük bir proje ise, yöntemyeniden adlandırmak için Visual StudioRefactoring seçenekleri kullanabilirsiniz.Daha fazla bilgi için bkz. Sınıfları ve Türleri Yeniden Düzenleme (Sınıf Tasarımcısı).

Alternatif olarak, anahtar sözcük kullanarak uyarı engelleyebilirsiniznew , türetilmiş bir sınıf tanımı içinde:

class YourDerivedGraphicsClass : GraphicsClass
{
    public new void DrawRectangle() { }
}

Kullanarak new anahtar sözcük tanımınızı temel sınıfiçinde yer alan tanımı gizler derleyici söyler. Varsayılan davranış budur.

Geçersiz kılma ve yöntem seçimi

sınıfadlı bir yöntem , C# derleyici birden fazla yöntem gibi arama ile uyumlu olup olmadığını aramak için en iyi yöntem seçer iki yöntem aynı ad ve parametre ile uyumlu olan parametreleri olduğunda.Aşağıdaki yöntemlerden uyumlu olacaktır:

public class Derived : Base
{
    public override void DoWork(int param) { }
    public void DoWork(double param) { }
}

Zaman DoWork örneğinde adlı Derived, C# derleyici varsayılan arama sürümleri ile uyumlu hale getirmek deneyecek DoWork ilk olarak bildirilen Derived.Override yöntemleri sınıfbildirilen olarak dikkate alınmaz, bunlar yeni bir temel sınıfbildirilmiş bir yöntem uygulamaları.C# derleyici , özgün bir yöntem yöntem çağrısı yalnızca eşleştirilemiyor, Derived aynı adı ve uyumlu parametreler geçersiz kılınmış bir yöntem çağrısına uyacak şekilde deneyin.Örne?in:

int val = 5;
Derived d = new Derived();
d.DoWork(val);  // Calls DoWork(double).

Çünkü değişken val , bir double'a dönüştürülebilir C# derleyici çağrıları DoWork(double) yerine DoWork(int). Bunu önlemek için iki yol vardır.İlk olarak, sanal yöntemleri aynı ada sahip yeni bir yöntem bildirmenin kaçının.İkinci olarak, temel sınıfyöntem listesinde örneği kaldýrarak arama yaparak sanal bir yöntem çağırmak için C# derleyici söyleyebilir Derived için Base. yöntem virtual olduğundan uygulaması DoWork(int) üzerinde Derived olarak adlandırılır.Örne?in:

((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.

Daha fazla örnek için new ve override, bkz: Geçersiz Kılmanın ve Yeni Anahtar Sözcüklerin Ne Zaman Kullanılacağını Bilme (C# Programlama Kılavuzu).

Ayrıca bkz.

Başvuru

Sınıflar ve Yapılar (C# Programlama Kılavuzu)

Yöntemler (C# Programlama Kılavuzu)

Devralma (C# Programlama Kılavuzu)

Kavramlar

C# Programlama Kılavuzu