newVe 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. abstractyö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. abstractSı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ışı ShowInfouygulamaya göre değişir:
Person person = new Teacher();
person.ShowInfo();
person = new Student();
person.ShowInfo();
Hem Students hem Teacherde Persons, ancak kendileri hakkında bilgi istemeleri istendiğinde farklı davranırlar. Ancak, onlardan bilgilerini istemelerini istemenin yolu aynıdır: PersonSınıf arayüzünü kullanmak .
Peki, miras aldığınızda perde arkasında ne olur Person? Uygulama ShowInfosı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 , Students'ye işaret eder ShowInfo:

2. Sanal yöntemler
İkinci yol, virtualyö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 ):Personabstract

Şimdilik ilk resimden farklı görünmediğini fark etmelisiniz. Bunun nedeni, virtualyöntemin " standart yolu " bir uygulamaya işaret etmesidir . Kullanılması virtual, görebiliyorsun Personso, olabilir (değil gerekir için farklı bir uygulama sağlamak) ShowInfo. Yukarıda overrideyaptığı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
newdaha ç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!