Devralma-daha özelleştirilmiş davranış oluşturmak için türleri türet

Kapsülleme ve çok biçimlilik ile birlikte devralma, nesne odaklı programlamanın üç birincil özelliklerinden biridir. Devralma, diğer sınıflarda tanımlanan davranışı yeniden kullanan, genişleten ve değiştiren yeni sınıflar oluşturmanıza olanak sağlar. Üyeleri devralınmış olan sınıfa temel sınıf denir ve bu üyeleri devralan sınıfa türetilmiş sınıf denir. Türetilmiş bir sınıfın yalnızca bir doğrudan temel sınıfı olabilir. Ancak, devralma geçişlidir. ClassC, Öğesinden türetildiyse ClassB ve ClassB öğesinden türetildiyse ClassA , ve ' ClassC de belirtilen üyeleri devralır ClassB ClassA .

Not

Yapılar devralmayı desteklemez, ancak arabirimler uygulayabilir.

Kavramsal olarak, türetilmiş bir sınıf temel sınıfın bir özelleştirmesi olur. Örneğin, bir taban sınıfınız varsa adlı bir Animal türetilmiş sınıfa Mammal ve adında başka bir türetilmiş sınıfa sahip olabilirsiniz Reptile . Mammal Animal , Bir, ve bir Reptile olur Animal , ancak her türetilmiş sınıf temel sınıfın farklı özelleştirmelerini temsil eder.

Arabirim bildirimleri, üyeleri için varsayılan bir uygulama tanımlayabilir. Bu uygulamalar, türetilmiş arabirimler ve bu arabirimleri uygulayan sınıflar tarafından devralınır. Varsayılan arabirim yöntemleri hakkında daha fazla bilgi için arabirimlersayfasındaki makaleye bakın.

Başka bir sınıftan türetmek için bir sınıf tanımladığınızda, türetilmiş sınıf, oluşturucular ve sonlandırıcılar hariç, temel sınıfın tüm üyelerini dolaylı olarak kazanıyor. Türetilmiş sınıf, kodu yeniden uygulamaya gerek kalmadan temel sınıfta yeniden kullanır. Türetilmiş sınıfa daha fazla üye ekleyebilirsiniz. Türetilmiş sınıf, temel sınıfın işlevselliğini genişletir.

Aşağıdaki çizimde, WorkItem bazı iş sürecindeki bir iş öğesini temsil eden bir sınıf gösterilmektedir. Tüm sınıflar gibi, öğesinden türetilir System.Object ve tüm yöntemlerini devralır. WorkItem kendisine ait beş üyeyi ekler. Oluşturucular devroluşturulmadığından bu Üyeler bir Oluşturucu içerir. Sınıf ChangeRequest öğesinden devralır WorkItem ve belirli bir iş öğesi türünü temsil eder. ChangeRequest devralınan üyelere ve kaynağından daha fazla üye ekler WorkItem Object . Kendi oluşturucusunu eklemesi ve ayrıca eklemesi gerekir originalItemID . Özelliği, originalItemID ChangeRequest Örneğin WorkItem değişiklik isteğinin uygulandığı orijinalle ilişkilendirilmesini sağlar.

Sınıf devralmayı gösteren diyagram

Aşağıdaki örnek, önceki çizimde gösterilen sınıf ilişkilerinin C# dilinde nasıl ifade edildiği gösterilmektedir. Örnek ayrıca WorkItem sanal yöntemin nasıl geçersiz kılındığını Object.ToString ve ChangeRequest sınıfın yöntem uygulamasını nasıl devraldığını gösterir WorkItem . İlk blok sınıfları tanımlar:

// WorkItem implicitly inherits from the Object class.
public class WorkItem
{
    // Static field currentID stores the job ID of the last WorkItem that
    // has been created.
    private static int currentID;

    //Properties.
    protected int ID { get; set; }
    protected string Title { get; set; }
    protected string Description { get; set; }
    protected TimeSpan jobLength { get; set; }

    // Default constructor. If a derived class does not invoke a base-
    // class constructor explicitly, the default constructor is called
    // implicitly.
    public WorkItem()
    {
        ID = 0;
        Title = "Default title";
        Description = "Default description.";
        jobLength = new TimeSpan();
    }

    // Instance constructor that has three parameters.
    public WorkItem(string title, string desc, TimeSpan joblen)
    {
        this.ID = GetNextID();
        this.Title = title;
        this.Description = desc;
        this.jobLength = joblen;
    }

    // Static constructor to initialize the static member, currentID. This
    // constructor is called one time, automatically, before any instance
    // of WorkItem or ChangeRequest is created, or currentID is referenced.
    static WorkItem() => currentID = 0;

    // currentID is a static field. It is incremented each time a new
    // instance of WorkItem is created.
    protected int GetNextID() => ++currentID;

    // Method Update enables you to update the title and job length of an
    // existing WorkItem object.
    public void Update(string title, TimeSpan joblen)
    {
        this.Title = title;
        this.jobLength = joblen;
    }

    // Virtual method override of the ToString method that is inherited
    // from System.Object.
    public override string ToString() =>
        $"{this.ID} - {this.Title}";
}

// ChangeRequest derives from WorkItem and adds a property (originalItemID)
// and two constructors.
public class ChangeRequest : WorkItem
{
    protected int originalItemID { get; set; }

    // Constructors. Because neither constructor calls a base-class
    // constructor explicitly, the default constructor in the base class
    // is called implicitly. The base class must contain a default
    // constructor.

    // Default constructor for the derived class.
    public ChangeRequest() { }

    // Instance constructor that has four parameters.
    public ChangeRequest(string title, string desc, TimeSpan jobLen,
                         int originalID)
    {
        // The following properties and the GetNexID method are inherited
        // from WorkItem.
        this.ID = GetNextID();
        this.Title = title;
        this.Description = desc;
        this.jobLength = jobLen;

        // Property originalItemId is a member of ChangeRequest, but not
        // of WorkItem.
        this.originalItemID = originalID;
    }
}

Bu sonraki blok, temel ve türetilmiş sınıfların nasıl kullanılacağını gösterir:

// Create an instance of WorkItem by using the constructor in the
// base class that takes three arguments.
WorkItem item = new WorkItem("Fix Bugs",
                            "Fix all bugs in my code branch",
                            new TimeSpan(3, 4, 0, 0));

// Create an instance of ChangeRequest by using the constructor in
// the derived class that takes four arguments.
ChangeRequest change = new ChangeRequest("Change Base Class Design",
                                        "Add members to the class",
                                        new TimeSpan(4, 0, 0),
                                        1);

// Use the ToString method defined in WorkItem.
Console.WriteLine(item.ToString());

// Use the inherited Update method to change the title of the
// ChangeRequest object.
change.Update("Change the Design of the Base Class",
    new TimeSpan(4, 0, 0));

// ChangeRequest inherits WorkItem's override of ToString.
Console.WriteLine(change.ToString());
/* Output:
    1 - Fix Bugs
    2 - Change the Design of the Base Class
*/

Soyut ve sanal yöntemler

Bir temel sınıf olarak bir yöntemi bildiriyorsa virtual , türetilmiş bir sınıf override yöntemi kendi uygulamasına sahip olabilir. Bir temel sınıf olarak bir üye bildirirse abstract , bu yöntemin doğrudan bu sınıftan devralan Özet olmayan herhangi bir sınıfta geçersiz kılınmalıdır. Türetilmiş bir sınıf kendi soyut ise, soyut üyeleri Uygulamasız devralır. Soyut ve sanal üyeler, nesne odaklı programlamanın ikinci birincil özelliği olan çok biçimlilik için temeldir. Daha fazla bilgi için bkz. çok biçimlilik.

Soyut temel sınıflar

New işlecini kullanarak doğrudan örnek oluşturmayı engellemek istiyorsanız, bir sınıfı soyut olarak bildirebilirsiniz. Soyut bir sınıf, yalnızca yeni bir sınıf ondan türetilirse kullanılabilir. Soyut bir sınıf, kendilerine soyut olarak bildirildiği bir veya daha fazla yöntem imzası içerebilir. Bu imzalar parametreleri ve dönüş değerini belirtir, ancak hiçbir uygulamaya (Yöntem gövdesi) sahip olmaz. Soyut bir sınıfın soyut Üyeler içermesi gerekmez; Ancak, bir sınıf soyut üye içeriyorsa, sınıfın kendisi Özet olarak bildirilmelidir. Soyut olmayan türetilmiş sınıflar, soyut bir temel sınıftan herhangi bir soyut Yöntem için uygulama sağlamalıdır.

Arabirimler

Arabirim , bir üye kümesini tanımlayan bir başvuru türüdür. Bu arabirimi uygulayan tüm sınıfların ve yapıların bu üye kümesini uygulaması gerekir. Arabirim, bu üyelerin herhangi biri veya tümü için varsayılan bir uygulama tanımlayabilir. Bir sınıf, yalnızca tek bir doğrudan taban sınıftan türeyebilse de birden çok arabirim uygulayabilir.

Arabirimler, "bir" a "ilişkisine sahip olmayan sınıflar için belirli özellikleri tanımlamak üzere kullanılır. Örneğin, bu System.IEquatable<T> arabirim, türün iki nesnesinin eşdeğer olup olmadığını (ancak, tür denklik tanımlar) anlamak için herhangi bir sınıf veya yapı tarafından uygulanabilir. IEquatable<T> , bir temel sınıf ve türetilmiş bir sınıf (örneğin, a) arasında bulunan "bir" ilişki türü anlamına gelmez Mammal Animal . Daha fazla bilgi için bkz. arabirimler.

Daha fazla türetme engelleniyor

Bir sınıf, kendisini veya üyeyi olarak bildirerek, diğer sınıfların kendisinden veya üyelerinden birinden devralmasını önleyebilir sealed .

Temel sınıf üyelerinin türetilmiş sınıf gizlemesi

Türetilmiş bir sınıf, aynı ada ve imzaya sahip üyeleri bildirerek, temel sınıf üyelerini gizleyebilir. newDeğiştirici, üyenin temel üyenin bir geçersiz kılma olması amaçlanmadığını açıkça belirtmek için kullanılabilir. Kullanılması new gerekli değildir, ancak kullanılmazsa bir derleyici uyarısı oluşturulacaktır new . Daha fazla bilgi için bkz. geçersiz kılma ve Yeni anahtar sözcüklerle sürüm oluşturma ve geçersiz kılma ve yeni anahtar sözcüklerin ne zaman kullanılacağını bilme.