Aracılığıyla paylaş


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

Biçimlilik genellikle saklama ve devralma sonra nesne yönelimli programlama, üçüncü sütun olarak adlandırılır.Biçimlilik "çok şeklindeki" anlamına gelir, Yunanca sözcüktür ve iki farklı yönlerini vardır:

  • Çalışma zamanında bir türetilmiş sınıfta nesnelerin nesnelerin yöntem parametreleri ve koleksiyonları veya dizileri gibi yerlerde bir temel sınıf olarak değerlendirilecek.Bu durumda, nesnenin bildirilmiş türü artık çalışma zamanı türünü aynıdır.

  • Base classes may define and implement virtualmethods, and derived classes can override them, which means they provide their own definition and implementation.Çalışma zamanında, istemci kod yöntemini çağırır CLR nesnesinin çalışma zamanı türü arar ve bu geçersiz kılma sanal yöntemi çağırır.Bu nedenle, kaynağı kodunuzda bir temel sınıf üzerinde bir yöntemini çağırın ve yöntemin yürütülmesi için türetilmiş sınıf sürümü neden.

Sanal yöntemleri tek bir yolla ilgili nesnelerin grupları ile çalışmak etkinleştirin.Örneğin, bir çizim yüzey üzerinde çeşitli şekiller oluşturmak bir kullanıcının sağlayan bir çizim uygulamasına sahip düşünün.Derleme sırasında kullanıcı hangi türde şekiller oluşturacak bilmiyorsanız.Ancak, tüm çeşitli oluşturulmuş şekiller izlemek uygulama vardır ve bunları kullanıcı fare eylemlerine yanıt olarak güncelleştirmek, sahip.İki temel adımda bu sorunu çözmek için biçimlilik kullanabilirsiniz:

  1. Her belirli shape sınıfı ortak bir taban sınıfından türetilen sınıf hiyerarşisi oluşturun.

  2. İlgili yöntemi herhangi bir türetilmiş sınıf için temel sınıf yöntemi tek bir çağrıyla üzerinde çağırmak için bir sanal yöntemini kullanın.

Önce adında bir temel sınıf oluşturun Shapeve türetilmiş sınıfları gibi Rectangle, Circle, ve Triangle.Verin Shape adlı sanal bir yöntem sınıfının Draw, ve geçersiz kılma belirli çizmek için her bir türetilmiş sınıfta bu şekil, sınıfı temsil eder.Oluşturma bir List<Shape> nesnesi ve bir daire, üçgen ve dikdörtgen ekleyin.Çizim yüzeyi güncelleştirmek için kullanın bir foreach araması ve listesindeki yinelemek için döngü Draw yöntemi her Shape listesinde nesne.Listedeki her bir nesne bildirilmiş türünde bir sahip olsa da Shape, çağrılacak çalışma zamanı tür (yöntem her bir türetilmiş sınıfta geçersiz kılınan sürüm).

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ürleri dahil olmak üzere tüm türleri devralınır çünkü C# ' ta her tür çok biçimli Object.

Biçimlilik genel bakış

Sanal üyeleri

Bir türetilmiş sınıf bir taban sınıfından devralan olduğunda, tüm yöntemler, alanları, özellikler ve olaylar temel sınıfın kazanır.Türetilen sınıfın Tasarımcısı seçebilirsiniz kullanılıp kullanılmayacağını

  • temel sınıf sanal üyeleri geçersiz kıl

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

  • Yeni sanal olmayan uygulaması temel sınıf uygulamaları Gizle bu üyelerin tanımlayın

Temel sınıf üyesi olarak bildirilirse türetilmiş sınıf bir temel sınıf üyesi geçersiz kılabilirsiniz sanal veya Özet.Türetilen üye kullanmalıdır geçersiz kılma yöntemi sanal çağırma katılmak amaçlanmıştır açıkça belirtmek için bir 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öntemler, özellikler, olaylar ve Dizinleyicileri sanal olabilir.Bir türetilmiş sınıfta sanal bir üye geçersiz kılar, bu üyede bu sınıfının bir örneği temel sınıfının bir örneği bile erişilen durumlarda çağrılır.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.

Türetilen sınıfların bir yöntemi temel sınıf uygulamasını kullanmak gerek kalmadan bir temel sınıf genişletmek sanal yöntemleri ve özellikleri sağlar.Daha fazla bilgi için bkz. Geçersiz Kılma ve Yeni Anahtar Sözcüklerle Sürüm Oluşturma (C# Programlama Kılavuzu).Bir arabirim yöntemini veya türetilen sınıflar için ayarlanmış uygulaması bırakılır yöntemleri kümesini tanımlamak için başka bir yol sağlar.Daha fazla bilgi için bkz. Arabirimler (C# Programlama Kılavuzu).

Temel sınıf üyeleri yeni üyeleriyle gizleme

Temel sınıf, bir üye olarak aynı ada sahip türetilen üyelik istediğiniz ancak sanal çağırma katılmak için istemiyorsanız, kullanabilirsiniz, yeni anahtar sözcük.new Anahtar sözcük, değiştirilmekte olan bir sınıf üyesi dönüş türünü önce yerleştirin.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 temel sınıf üyeleri, istemci kodundan temel sınıfının bir örneği için türetilmiş sınıf örneği atamayı tarafından 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.

Türetilen sınıfların sanal üyeleri geçersiz kılmasını önleme

Sanal üyeleri sanal sonsuza kadar kaç sınıfları sanal üye ve başlangıçta bildirilmiş sınıf arasında bildirilmiş bağımsız olarak kalır.Bağımsız olarak sanal bir üye sınıfı bir bildirir ve bir sınıf B türetilen ve C C sınıfı B türetilen sınıfı, sanal üye devralınır ve geçersiz kılmak için seçeneği olan, bir geçersiz kılma bu üye için bildirilmiş 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üretilen bir sınıftan bildiren bir geçersiz kılma olarak tarafından sanal devralma durdurabilirsiniz korumalı.Bu yerleştirme gerektirir sealed önce anahtar sözcük override sınıf üye bildirimindeki anahtar sözcük.Aşağıdaki kod örneği sağlar:

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

Önceki örnekte, yöntem DoWork artık C. türetilen herhangi bir sınıf için sanal değilC örneklerini bile için yine de sanal varsa, bunlar türü B veya türü A. castKorumalı yöntemleri değiştirilen tarafından türetilen sınıfların kullanarak new anahtar sözcük, aşağıdaki örnekte gösterildiği gibi:

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

Bu durumda, DoWork D, türünde bir değişken kullanarak D üzerinde çağrılır yeni DoWork çağrılır.C, B veya bir türde bir değişken D, bir çağrı örneği erişmek için kullanılıp kullanılmadığını DoWork uygulanmasına yönelik bu çağrıları yönlendirme sanal devralma kurallarını izleyecektir DoWork C. sınıfındaki

Türetilen sınıfların temel sınıf sanal üyelerine erişme

Varsa veya bir yöntemi veya özelliği geçersiz türetilmiş sınıf yöntemi veya özelliği temel anahtar sözcüğünü kullanarak temel sınıfı üzerinde 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 temel.

[!NOT]

Sanal üyeleri kullanmanız önerilir base kendi uygulamasında, bu üyenin temel sınıf uygulamasını çağırmak için.Türetilen sınıfı üzerinde odaklanmanızı sağlar ortaya temel sınıf davranışı için türetilmiş sınıf belirli davranışını uygulamanın beklemek.Temel sınıf uygulamasını çağrılmaz, bunların davranışı temel sınıfın davranışı ile uyumlu hale getirmek için türetilmiş sınıf kadar olur.

Bu Bölümde

Ayrıca bkz.

Başvuru

Devralma (C# Programlama Kılavuzu)

Soyut ve Korumalı Sınıflar ve Sınıf Üyeleri (C# Programlama Kılavuzu)

Yöntemler (C# Programlama Kılavuzu)

Olaylar (C# Programlama Kılavuzu)

Özellikler (C# Programlama Kılavuzu)

Dizin Oluşturucular (C# Programlama Kılavuzu)

Türler (C# Programlama Kılavuzu)

Kavramlar

C# Programlama Kılavuzu

C# Programlama Kılavuzu