new
Ve virtual
/ arasında bir fark var override
.
Bir sınıfın somutlaştırıldığında, yöntemlerinin gerçek uygulamasına işaret eden bir işaretçiler tablosundan başka bir şey olmadığını hayal edebilirsiniz. Aşağıdaki görsel bunu oldukça iyi görselleştirmelidir:
Şimdi farklı yollar var, bir yöntem tanımlanabilir. Her biri kalıtımla kullanıldığında farklı davranır. Standart yol her zaman yukarıdaki resimde gösterildiği gibi çalışır. Bu davranışı değiştirmek isterseniz, yönteminize farklı anahtar sözcükler ekleyebilirsiniz.
1. Özet dersleri
İlki abstract
. abstract
yöntemler hiçbir yere işaret etmez:
Sınıfınız soyut üyeler içeriyorsa, aynı zamanda olarak işaretlenmesi gerekir abstract
, aksi takdirde derleyici uygulamanızı derlemez. abstract
Sınıfların örneklerini oluşturamazsınız , ancak bunlardan devralabilir ve devralınan sınıflarınızın örneklerini oluşturabilir ve temel sınıf tanımını kullanarak bunlara erişebilirsiniz. Örneğinizde bu şöyle görünecektir:
public abstract class Person
{
public abstract void ShowInfo();
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a student!");
}
}
Çağrılırsa, davranışı ShowInfo
uygulamaya göre değişir:
Person person = new Teacher();
person.ShowInfo();
person = new Student();
person.ShowInfo();
Hem Student
s hem Teacher
de Person
s, ancak kendileri hakkında bilgi istemeleri istendiğinde farklı davranırlar. Ancak, onlardan bilgilerini istemelerini istemenin yolu aynıdır: Person
Sınıf arayüzünü kullanmak .
Peki, miras aldığınızda perde arkasında ne olur Person
? Uygulama ShowInfo
sırasında, işaretçi artık hiçbir yere işaret etmiyor, şimdi gerçek uygulamaya işaret ediyor! Bir Student
örnek oluştururken , Student
s'ye işaret eder ShowInfo
:
2. Sanal yöntemler
İkinci yol, virtual
yöntemleri kullanmaktır . Temel sınıfınızda isteğe bağlı bir varsayılan uygulama sağlamanız dışında davranış aynıdır . İle sınıfları virtual
üyeleri instanciated olabilir, bununla birlikte kalıtsal sınıfları, farklı uygulamalar sağlayabilir. İşte kodunuzun çalışması için gerçekte nasıl görünmesi gerektiği:
public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am a person!");
}
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
Temel fark, temel üyenin artık hiçbir yerePerson.ShowInfo
işaret etmemesidir. Bu aynı zamanda, neden örnek oluşturabilmenizin nedenidir (ve bu nedenle artık olarak işaretlenmesine gerek yoktur ):Person
abstract
Şimdilik ilk resimden farklı görünmediğini fark etmelisiniz. Bunun nedeni, virtual
yöntemin " standart yolu " bir uygulamaya işaret etmesidir . Kullanılması virtual
, görebiliyorsun Persons
o, olabilir (değil gerekir için farklı bir uygulama sağlamak) ShowInfo
. Yukarıda override
yaptığım gibi farklı bir uygulama (kullanarak ) sağlarsanız Teacher
, görüntü ile aynı görünecektir abstract
. Aşağıdakiler için özel bir uygulama sağlamadığımızı düşünün Student
:
public class Student : Person
{
}
Kod şu şekilde adlandırılacaktır:
Person person = new Teacher();
person.ShowInfo();
person = new Student();
person.ShowInfo();
Ve için resim Student
şöyle görünecektir:
3. "Gölgeleme" olarak da bilinen sihirli "yeni" anahtar kelime
new
daha çok bunun etrafında bir hack. Temel sınıf / arabirimdeki yöntemlerle aynı adlara sahip genelleştirilmiş sınıflarda yöntemler sağlayabilirsiniz. Her ikisi de kendi özel uygulamalarına işaret ediyor:
Uygulama sağladığınız gibi görünüyor. Yönteme erişim şeklinize bağlı olarak davranış farklılık gösterir:
Teacher teacher = new Teacher();
Person person = (Person)teacher;
teacher.ShowInfo();
person.ShowInfo();
Bu davranış istenebilir, ancak sizin durumunuzda yanıltıcıdır.
Umarım bu, sizin için daha anlaşılır hale getirir!