Ada perbedaan antara new
dan 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
. abstract
metode 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 abstract
kelas, 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 ShowInfo
bervariasi, 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, Student
s dan Teacher
s adalah Person
s, 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 Person
antarmuka 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 Student
instance, itu menunjuk ke Student
s ShowInfo
:
2. Metode virtual
Cara kedua adalah menggunakan virtual
metode. Perilaku ini sama, kecuali Anda memberikan implementasi standar opsional di kelas dasar Anda. Kelas dengan virtual
anggota 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.ShowInfo
tidak menunjuk ke mana- mana lagi. Ini juga alasannya, mengapa Anda dapat membuat instance Person
(dan karenanya tidak perlu ditandai abstract
lagi):
Anda harus perhatikan, bahwa ini tidak terlihat berbeda dari gambar pertama untuk saat ini. Ini karena virtual
metode 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 Teacher
atas, gambar akan terlihat sama seperti untuk abstract
. Bayangkan, kami tidak menyediakan implementasi khusus untuk Student
s:
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 Student
akan terlihat seperti ini:
3. Kata kunci ajaib `baru` alias" Membayangi "
new
lebih 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!