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 ClassB
türetilirse ve ClassB
öğesinden ClassA
ClassC
türetilirseClassC
, ve ClassA
iç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 Animal
varsa, adlı bir türetilmiş sınıfınız ve adlı Mammal
başka bir türetilmiş sınıfınız Reptile
olabilir. A Mammal
bir Animal
, ve a Reptile
ise bir Animal
olur, 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 WorkItem
Objectdevraldığı ü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
.
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.ToStringChangeRequest
WorkItem
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 virtual
bildirdiğinde, türetilmiş bir sınıf kendi uygulamasıyla yöntemini kullanabilir override
. Bir temel sınıf bir üyeyi olarak abstract
bildirirse, 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, Mammal
Animal
a 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 sealed
bildirerek 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.