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

Devralma, kapsülleme ve polimorfizm ile birlikte nesne odaklı programlamanın üç temel özelliğinden 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 tanır. Üyeleri devralınan sınıfa temel sınıf, bu üyeleri devralan sınıf ise türetilmiş sınıf olarak adlandırılır. Türetilmiş bir sınıfın yalnızca bir doğrudan temel sınıfı olabilir. Ancak devralma geçişli olur. öğesinden ClassBtüretilirse ve ClassB öğesinden ClassAClassC türetilirseClassC, ve ClassAiçinde ClassB bildirilen üyeleri devralır.

Not

Yapılar devralmayı desteklemez, ancak arabirimler uygulayabilir.

Kavramsal olarak, türetilmiş bir sınıf temel sınıfın bir uzmanlığıdır. Örneğin, bir temel sınıfınız Animalvarsa, adlı bir türetilmiş sınıfınız ve adlı Mammal başka bir türetilmiş sınıfınız Reptileolabilir. A Mammal bir Animal, ve a Reptile ise bir Animalolur, ancak türetilen her 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 arabirimler hakkındaki makaleye bakın.

Başka bir sınıftan türetilen bir sınıf tanımladığınızda, türetilmiş sınıf, oluşturucuları ve sonlandırıcıları dışında temel sınıfın tüm üyelerini örtük olarak kazanır. Türetilmiş sınıf, kodu yeniden uygulamak zorunda kalmadan temel sınıfta yeniden kullanıyor. 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, bazı iş süreçlerindeki bir iş öğesini temsil eden bir sınıf WorkItem gösterilmektedir. Tüm sınıflar gibi, tüm yöntemlerinden System.Object türetilir ve devralır. WorkItem kendi altı üyesini ekler. Oluşturucular devralınmadığından bu üyeler bir oluşturucu içerir. Sınıfı ChangeRequest , öğesinden WorkItem devralır ve belirli bir iş öğesi türünü temsil eder. ChangeRequest öğesinden ve öğesinden WorkItemObjectdevraldığı üyelere iki üye daha ekler. Kendi oluşturucusunu eklemesi gerekir ve ayrıca ekler originalItemID. ÖzelliğioriginalItemID, örneğin değişiklik isteğinin geçerli olduğu özgün WorkItem örnekle ilişkilendirilmesine olanak tanırChangeRequest.

Diagram that shows class inheritance

Aşağıdaki örnekte, önceki çizimde gösterilen sınıf ilişkilerinin C# dilinde nasıl ifade edildiği gösterilmektedir. Örnekte sanal yönteminin nasıl WorkItem geçersiz kılındığı ve sınıfının yönteminin Object.ToStringChangeRequestWorkItem uygulanmasını nasıl devraldığı da gösterilmektedir. İ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 bir yöntemi olarak virtualbildirdiğinde, türetilmiş bir sınıf kendi uygulamasıyla yöntemini kullanabilir override . Bir temel sınıf bir üyeyi olarak abstractbildirirse, bu yöntem doğrudan bu sınıftan devralan soyut olmayan herhangi bir sınıfta geçersiz kılınmalıdır. Türetilmiş bir sınıfın kendisi soyutsa, soyut üyeleri uygulamadan devralır. Soyut ve sanal üyeler, nesne odaklı programlamanın ikinci birincil özelliği olan polimorfizmin temelini oluşturur. Daha fazla bilgi için bkz . Polimorfizm.

Soyut temel sınıflar

Yeni işlecini kullanarak doğrudan örneklemeyi önlemek istiyorsanız bir sınıfı soyut olarak bildirebilirsiniz. Soyut bir sınıf yalnızca ondan yeni bir sınıf türetilirse kullanılabilir. Soyut sınıf, kendilerinin soyut olarak bildirdiği bir veya daha fazla yöntem imzası içerebilir. Bu imzalar parametreleri ve dönüş değerini belirtir, ancak uygulaması yoktur (yöntem gövdesi). Soyut sınıfın soyut üyeler içermesi gerekmez; ancak, bir sınıf soyut üye içeriyorsa, sınıfın kendisi soyut olarak bildirilmelidir. Soyut olmayan türetilmiş sınıflar, soyut bir temel sınıftan herhangi bir soyut yöntem için uygulamayı 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 ve yapılar bu üye kümesini uygulamalıdır. 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 temel sınıftan türetilebilir olsa bile birden çok arabirim uygulayabilir.

Arabirimler, "is a" ilişkisine sahip olması gerekmeyen sınıflar için belirli özellikleri tanımlamak için kullanılır. Örneğin, arabirim türün iki nesnesinin System.IEquatable<T> eşdeğer olup olmadığını belirlemek için herhangi bir sınıf veya yapı tarafından uygulanabilir (ancak tür denkliği tanımlar). IEquatable<T> temel sınıf ile türetilmiş bir sınıf (örneğin, MammalAnimala bir) arasında var olan "is" ilişkisinin aynı türünü ima etmez. Daha fazla bilgi için bkz . Arabirimler.

Daha fazla türetme yapılmasını önleme

Sınıf, kendisini veya üyeyi olarak sealedbildirerek diğer sınıfların bu sınıftan veya üyelerinden herhangi birinden devralmasını engelleyebilir.

Temel sınıf üyelerinin gizlendiği türetilmiş sınıf

Türetilmiş bir sınıf, aynı ad ve imzaya sahip üyeler bildirerek temel sınıf üyelerini gizleyebilir. Değiştirici, new üyenin temel üyenin geçersiz kılması olarak tasarlanmamış olduğunu açıkça belirtmek için kullanılabilir. kullanımı new gerekli değildir, ancak kullanılmazsa new bir derleyici uyarısı oluşturulur. 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ı Bilmek.