Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 denir, bu üyeleri devralan sınıfa ise 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şli olur. Eğer ClassC
öğesi ClassB
öğesinden türetilirse ve ClassB
öğesi ClassA
öğesinden türetilirse, ClassC
öğesi ClassB
ve ClassA
öğelerinde bildirilen üyeleri devralır.
Uyarı
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, System.Object sınıfından türetilir ve tüm yöntemlerini devralır.
WorkItem
kendi altı üyesini ekler. Oluşturucular devralınmadığı için bu üyeler arasında bir oluşturucu bulunur. Sınıfı ChangeRequest
, öğesinden WorkItem
devralır ve belirli bir iş öğesi türünü temsil eder.
ChangeRequest
öğesi, WorkItem
ve Object öğelerinden devraldığı üyelere iki üye daha ekler. Kendi oluşturucusunu eklemesi gerekir, ayrıca originalItemID
de ekler. Özellik originalItemID
, ChangeRequest
örneğinin değişiklik isteğinin geçerli olduğu orijinal WorkItem
örnekle ilişkilendirilmesine olanak tanır.
Aşağıdaki örnekte, önceki çizimde gösterilen sınıf ilişkilerinin C# dilinde nasıl ifade edildiği gösterilmektedir. Örnekte, WorkItem
tarafından sanal yönteminin nasıl geçersiz kılındığı ve Object.ToString sınıfının, yöntemin ChangeRequest
tarafından uygulanmasını nasıl devraldığı 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 virtual
olarak bildirdiğinde, türetilmiş bir sınıf bu yöntemi kendi uygulamasıyla override
edebilir. 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, soyut olarak bildirilen 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.
Arayüzler
Arayüz, bir üye kümesini tanımlayan bir referans 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, System.IEquatable<T> arabirimi, belirli bir türün iki nesnesinin eşdeğer olup olmadığını belirlemek için herhangi bir sınıf veya yapı tarafından uygulanabilir (türün denkliği nasıl tanımladığına bağlı olarak).
IEquatable<T> temel sınıf ile türetilmiş bir sınıf arasında (örneğin, bir Mammal
bir Animal
dir) var olan "bir sınıf türüdür" ilişkisini aynı şekilde ifade etmez. Daha fazla bilgi için bakınız 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.
new
'nin kullanılması zorunlu değildir, ancak new
kullanılmadığında bir derleyici uyarısı oluşturulacaktır. 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.