Ada perbedaan antara newdan virtual/ override.
Anda dapat membayangkan, bahwa suatu kelas, ketika dipakai, tidak lebih dari sebuah tabel petunjuk, menunjuk pada implementasi aktual dari metodenya. Gambar berikut harus memvisualisasikan ini dengan cukup baik:

Sekarang ada berbagai cara, suatu metode dapat didefinisikan. Masing-masing berperilaku berbeda ketika digunakan dengan warisan. Cara standar selalu berfungsi seperti gambar di atas. Jika Anda ingin mengubah perilaku ini, Anda dapat melampirkan kata kunci yang berbeda ke metode Anda.
1. Kelas abstrak
Yang pertama adalah abstract. abstractmetode hanya menunjuk ke tempat:

Jika kelas Anda berisi anggota abstrak, itu juga harus ditandai sebagai abstract, jika tidak kompilator tidak akan mengkompilasi aplikasi Anda. Anda tidak bisa membuat instance abstractkelas, tetapi Anda bisa mewarisi dari mereka dan membuat instance dari kelas yang diwarisi dan mengaksesnya menggunakan definisi kelas dasar. Dalam contoh Anda ini akan terlihat seperti:
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!");
}
}
Jika dipanggil, perilaku ShowInfobervariasi, berdasarkan pada implementasi:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a student!'
Keduanya, Students dan Teachers adalah Persons, tetapi mereka berperilaku berbeda ketika mereka diminta untuk meminta informasi tentang diri mereka sendiri. Namun, cara untuk meminta mereka meminta informasi mereka, adalah sama: Menggunakan Personantarmuka kelas.
Jadi apa yang terjadi di balik layar, ketika Anda mewarisi dari Person? Saat menerapkan ShowInfo, pointer tidak menunjuk ke mana- mana lagi, sekarang menunjuk ke implementasi yang sebenarnya! Saat membuat sebuah Studentinstance, itu menunjuk ke Students ShowInfo:

2. Metode virtual
Cara kedua adalah menggunakan virtualmetode. Perilaku ini sama, kecuali Anda memberikan implementasi standar opsional di kelas dasar Anda. Kelas dengan virtualanggota dapat di-instanciated, namun kelas yang diwariskan dapat memberikan implementasi yang berbeda. Inilah kode yang seharusnya terlihat berfungsi:
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!");
}
}
Perbedaan utama adalah, bahwa anggota pangkalan Person.ShowInfotidak menunjuk ke mana- mana lagi. Ini juga alasannya, mengapa Anda dapat membuat instance Person(dan karenanya tidak perlu ditandai abstractlagi):

Anda harus perhatikan, bahwa ini tidak terlihat berbeda dari gambar pertama untuk saat ini. Ini karena virtualmetode ini menunjuk ke implementasi " cara standar ". Menggunakan virtual, Anda dapat mengatakan Persons, bahwa mereka dapat (tidak harus ) memberikan implementasi yang berbeda untuk ShowInfo. Jika Anda memberikan implementasi yang berbeda (menggunakan override), seperti yang saya lakukan untuk di Teacheratas, gambar akan terlihat sama seperti untuk abstract. Bayangkan, kami tidak menyediakan implementasi khusus untuk Students:
public class Student : Person
{
}
Kode akan dipanggil seperti ini:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a person!'
Dan gambar untuk Studentakan terlihat seperti ini:

3. Kata kunci ajaib `baru` alias" Membayangi "
newlebih hack di sekitar ini. Anda dapat memberikan metode dalam kelas umum, yang memiliki nama yang sama dengan metode di kelas dasar / antarmuka. Keduanya menunjuk pada implementasi kustom mereka sendiri:

Implementasinya terlihat seperti yang Anda berikan. Perilaku berbeda, berdasarkan cara Anda mengakses metode:
Teacher teacher = new Teacher();
Person person = (Person)teacher;
teacher.ShowInfo(); // Prints 'I am a teacher!'
person.ShowInfo(); // Prints 'I am a person!'
Perilaku ini bisa diinginkan, tetapi dalam kasus Anda itu menyesatkan.
Saya harap ini membuat hal-hal lebih jelas untuk dipahami untuk Anda!