Aracılığıyla paylaş


Çok biçimlilik (C# Programlama Kılavuzu)

Çok biçimlilik genellikle üçüncü pillar sonra saklama ve devralma nesne yönelimli programlama olarak adlandırılır.Çok biçimlilik, "çok şeklindeki" anlamına Yunanca sözcüktür ve iki farklı görünümü vardır:

  1. Çalışma zamanında, türetilmiş bir sınıf nesneleri bir temel sınıf yöntemi parametrelerini ve Koleksiyonlar veya diziler gibi yerlerde nesneler olarak değerlendirilecek.Bu durumda, bildirilen türü nesnenin artık kendi çalışma zamanı tür aynıdır.

  2. Temel sınıfları tanımlamak ve uygulamak sanalyöntemleri, ve türetilmiş sınıflar geçersiz kılma onları kendi tanımı ve uygulama sağladıkları anlamına gelir.clr istemci kodu yöntemini çağırdığında çalıştırma süresinde, nesneyi çalışma zamanı tür bakar ve o override yönteminin sanal çağırır.Bu nedenle kaynak kodunuzu üzerinde temel bir sınıf yöntemini çağırmak ve türetilmiş sınıf sürümü yürütülecek yöntem neden.

Sanal yöntemleri ile ilgili nesne grupları tek bir yolla çalışması etkinleştirin.Örneğin, bir çizim yüzeyi üzerinde çeşitli şekiller oluşturmak kullanıcının sağlayan bir çizim uygulaması olduğunu varsayalım.Derleme zamanında kullanıcının hangi türde şekiller oluşturacak bilmiyorsunuz.Ancak, oluşturulan şekiller, çeşitli türlerini izlemek uygulama vardır ve bunları kullanıcı fare eylemlerine güncelleştirmek vardır.Çok biçimlilik, iki temel adımlar bu sorunu çözmek için kullanabilirsiniz:

  1. Bir sınıf hiyerarşisi içinde her belirli shape sınıfının ortak Temel sınıftan türer oluşturun.

  2. Temel sınıf yöntemi tek bir çağrı yoluyla türetilmiş bir sınıf üzerinde uygun yöntemi çağırmak için sanal bir yöntem kullanın.

İlk olarak, temel bir sınıf oluşturmak Shapeve türetilmiş sınıfları gibi Rectangle, Circle, ve Triangle.Vermek Shape adlı sanal bir yöntem sınıf Draw, belli çizmek için her türetilmiş bir sınıf içinde şekil, sınıf override temsil eder.Oluşturma bir List<Shape> nesne ve bir daire, üçgen ve dikdörtgen ekleyebilirsiniz.Çizim yüzeyi güncelleştirmek için bir foreach listesi ve çağrı döngüsünü Draw yöntemi her Shape nesne listesinde.Listedeki her nesne bildirilen türü olmasına karşın Shape, çağrılacak çalışma zamanı tür (türetilmiş her sınıf yöntemi geçersiz kılınmış sürümünü).

public class Shape
{
    // A few example members
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }

    // Virtual method
    public virtual void Draw()
    {
        Console.WriteLine("Performing base class drawing tasks");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        // Code to draw a circle...
        Console.WriteLine("Drawing a circle");
        base.Draw();
    }
}
class Rectangle : Shape
{
    public override void Draw()
    {
        // Code to draw a rectangle...
        Console.WriteLine("Drawing a rectangle");
        base.Draw();
    }
}
class Triangle : Shape
{
    public override void Draw()
    {
        // Code to draw a triangle...
        Console.WriteLine("Drawing a triangle");
        base.Draw();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Polymorphism at work #1: a Rectangle, Triangle and Circle
        // can all be used whereever a Shape is expected. No cast is
        // required because an implicit conversion exists from a derived 
        // class to its base class.
        System.Collections.Generic.List<Shape> shapes = new System.Collections.Generic.List<Shape>();
        shapes.Add(new Rectangle());
        shapes.Add(new Triangle());
        shapes.Add(new Circle());

        // Polymorphism at work #2: the virtual method Draw is
        // invoked on each of the derived classes, not the base class.
        foreach (Shape s in shapes)
        {
            s.Draw();
        }

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

}

/* Output:
    Drawing a rectangle
    Performing base class drawing tasks
    Drawing a triangle
    Performing base class drawing tasks
    Drawing a circle
    Performing base class drawing tasks
 */

Kullanıcı tanımlı türler de dahil olmak üzere tüm türleri devralmıyor C# [NULL]'ta her tür uymanız, çünkü Object.

Çok biçimlilik genel bakış

ms173152.collapse_all(tr-tr,VS.110).gifSanal üye

Türetilmiş bir sınıf bir temel sınıftan kalıtımla alan, tüm yöntemleri, alanları, özellikleri ve olayları temel sınıfın kazanır.Türetilmiş bir sınıf tasarımcısına seçebilirsiniz kullanılıp kullanılmayacağını

  • Sanal üye taban sınıftaki geçersiz kıl

  • en yakın temel sınıf yöntemi geçersiz kılmasını olmadan devralır.

  • Yeni sanal olmayan uygulaması, temel sınıf uygulamalarını gizlemek bu üyeler tanımlamak

Temel sınıf üyesi olarak bildirilirse, türetilmiş bir sınıf bir temel sınıf üyesine kılabilirsiniz sanal veyasoyut.Türetilmiş üye kullanmanız gerekir geçersiz kılma yöntem içinde sanal çağırma katılmak içindir açıkça belirtmek için anahtar sözcük.Aşağıdaki kod örneği sağlar:

public class BaseClass
{
    public virtual void DoWork() { }
    public virtual int WorkProperty
    {
        get { return 0; }
    }
}
public class DerivedClass : BaseClass
{
    public override void DoWork() { }
    public override int WorkProperty
    {
        get { return 0; }
    }
}

Alanları sanal olamaz; yalnızca yöntemleri, özellikleri, olayları ve dizinleyici sanal olabilir.Türetilmiþ bir sýnýf sanal üye değiştirdiğinde, o sınıfın bir örneği temel sınıfın bir örneği olarak erişiliyor bile o üyeye denir.Aşağıdaki kod örneği sağlar:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Also calls the new method.

Sanal yöntemlerini ve özelliklerini temel sınıf bir yöntemin temel sınıf uygulaması kullanmaya gerek kalmadan genişletmek türetilmiş sınıfları sağlar.Daha fazla bilgi için bkz. Geçersiz kılma ve yeni anahtar sözcükler (C# Programlama Kılavuzu) sürüm oluşturma.Bir arabirim yöntemi ya da, uygulama için türetilmiş sınıflar sol yöntemler kümesini tanımlamak için başka bir yol sağlar.Daha fazla bilgi için bkz. Arabirimler (C# Programlama Kılavuzu).

ms173152.collapse_all(tr-tr,VS.110).gifTemel sınıf üyesi yeni üyeleriyle gizleme

Türetilmiş üyelik bir taban sınıfta üye aynı ada sahip olmasını istediğiniz, ancak içinde sanal çağırma katılmasına olanak istemiyorsanız, kullanabileceğiniz Yeni anahtar sözcüğü.new Anahtar değiştiriliyor sınıf üyesi dönüş türü önce koyun.Aşağıdaki kod örneği sağlar:

public class BaseClass
{
    public void DoWork() { WorkField++; }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { WorkField++; }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}

Gizli bir temel sınıf üyesi, istemci kodundan taban sınıfının bir örneği için türetilmiş bir sınıf örneğinin kaldýrarak hala erişilebilir.Örne?in:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Calls the old method.

ms173152.collapse_all(tr-tr,VS.110).gifTüretilmiş Sınıflar sanal üyeleri geçersiz kılmasını önleme

Sanal üye sanal sonsuza kadar kaç sınıfları sanal üye ve özgün olarak bildirilen sınıf arasında bildirilmiş olması bağımsız olarak kalır.Ne olursa olsun sınıf a, sanal bir üyenin bildirir ve a sınıfı b türer ve c, b, c sınıfı türetir sınıfı sanal üye miras alır ve onu geçersiz kılmak için bu seçeneği, bu üyenin geçersiz kılma bildirilen b olup sınıf.Aşağıdaki kod örneği sağlar:

public class A
{
    public virtual void DoWork() { }
}
public class B : A
{
    public override void DoWork() { }
}

Türetilmiþ bir sýnýf sanal devralmayı geçersiz kılma olarak bildirerek durdurabilirsiniz mühürlenmiş.Bu yerleştirme gerektirir sealed anahtar sözcükten önce override sınıf üyesi bildiriminde anahtar sözcüğü.Aşağıdaki kod örneği sağlar:

public class C : B
{
    public sealed override void DoWork() { }
}

Önceki örnekte, yöntem DoWork c ' türetilmiş tüm sınıflar için sanal olduğunuc örneklerini bile için hala sanal türü b veya a tipi artığını,Sealed yöntemler değiştirilmesine tarafından türetilmiş sınıfları kullanarak new aşağıdaki örnekte gösterildiği gibi anahtar sözcük:

public class D : C
{
    public new void DoWork() { }
}

Bu durumda, DoWork d, türünde bir değişken kullanarak d üzerinde adlı yeni DoWork olarak adlandırılır.c, b veya a türünde bir değişken d, çağrı örneği erişmek için kullanılıyorsa, DoWork uygulamasıyla Bu çağrıları yönlendirme sanal devralma kuralları takip edecek DoWork c sınıfı

ms173152.collapse_all(tr-tr,VS.110).gifTemel sınıf sanal üyeleri türetilen sınıflardan erişme

Varsa veya bir yöntem veya özellik geçersiz kılınmış türetilmiş bir sınıf yöntem veya özellik base anahtar sözcüğü kullanmak temel sınıfı erişmeye devam edebilirsiniz.Aşağıdaki kod örneği sağlar:

public class Base
{
    public virtual void DoWork() {/*...*/ }
}
public class Derived : Base
{
    public override void DoWork()
    {
        //Perform Derived's work here
        //...
        // Call DoWork on base class
        base.DoWork();
    }
}

Daha fazla bilgi için bkz: temel.

[!NOT]

Sanal üye kullanmanız önerilir base temel sınıf uygulaması, bu üyenin kendi uygulamasında aranacak.Türetilmiş sınıf üzerinde odaklanmasına olanak sağlayan ortaya temel sınıf davranış davranış türetilmiş bir sınıf belirli uygulama belirlemesine izin verme.Temel sınıf uygulaması çağrılmaz, davranışlarını temel sınıf davranış ile uyumlu hale getirmek için türetilmiş bir sınıf kadar olur.

Bu Bölümde

Ayrıca bkz.

Başvuru

Kalıtım (C# Programlama Kılavuzu)

Soyut ve mühürlenmiş sınıflar ve sınıf üyesi (C# Programlama Kılavuzu)

Yöntemleri (C# Programlama Kılavuzu)

Olayları (C# Programlama Kılavuzu)

Özellikler (C# Programlama Kılavuzu)

Dizinleyiciler (C# Programlama Kılavuzu)

Türleri (C# Programlama Kılavuzu)

Kavramlar

C# Programlama Kılavuzu

C# Programlama Kılavuzu