tl; dr - MenggunakanChild
lebihParent
disukai dalam lingkup lokal. Ini tidak hanya membantu keterbacaan, tetapi juga perlu untuk memastikan bahwa resolusi metode kelebihan beban bekerja dengan baik dan membantu memungkinkan kompilasi yang efisien.
Dalam lingkup lokal,
Parent obj = new Child(); // Works
Child obj = new Child(); // Better
var obj = new Child(); // Best
Secara konseptual, ini tentang menjaga informasi jenis yang paling mungkin. Jika kami menurunkan versi ke Parent
, kami pada dasarnya hanya menghapus informasi jenis yang bisa berguna.
Mempertahankan informasi tipe yang lengkap memiliki empat keunggulan utama:
- Memberikan informasi lebih lanjut kepada kompiler.
- Memberikan lebih banyak informasi kepada pembaca.
- Kode lebih bersih dan lebih standar.
- Membuat logika program lebih bisa berubah.
Keuntungan 1: Informasi lebih lanjut ke kompiler
Jenis yang jelas digunakan dalam resolusi metode kelebihan beban dan optimasi.
Contoh: Resolusi metode kelebihan beban
main()
{
Parent parent = new Child();
foo(parent);
Child child = new Child();
foo(child);
}
foo(Parent arg) { /* ... */ } // More general
foo(Child arg) { /* ... */ } // Case-specific optimizations
Dalam contoh di atas, kedua foo()
panggilan berfungsi , tetapi dalam satu kasus, kami mendapatkan resolusi metode kelebihan beban yang lebih baik.
Contoh: Optimasi kompiler
main()
{
Parent parent = new Child();
var x = parent.Foo();
Child child = new Child();
var y = child .Foo();
}
class Parent
{
virtual int Foo() { return 1; }
}
class Child : Parent
{
sealed override int Foo() { return 2; }
}
Dalam contoh di atas, kedua .Foo()
panggilan pada akhirnya memanggil override
metode yang sama yang mengembalikan 2
. Hanya saja, dalam kasus pertama, ada pencarian metode virtual untuk menemukan metode yang benar; pencarian metode virtual ini tidak diperlukan dalam kasus kedua sejak metode itu sealed
.
Kredit untuk @Ben yang memberikan contoh serupa dalam jawabannya .
Keuntungan 2: Informasi lebih lanjut kepada pembaca
Mengetahui jenis yang tepat, yaitu Child
, memberikan lebih banyak informasi kepada siapa pun yang membaca kode, sehingga lebih mudah untuk melihat apa yang sedang dilakukan program.
Tentu, mungkin tidak peduli dengan kode aktual karena kedua parent.Foo();
dan child.Foo();
masuk akal, tapi bagi seseorang melihat kode untuk pertama kalinya, informasi lebih lanjut hanya biasa membantu.
Selain itu, tergantung pada lingkungan pengembangan Anda, IDE mungkin dapat memberikan tooltips lebih bermanfaat dan metadata tentang Child
dibanding Parent
.
Keuntungan 3: Lebih bersih, kode lebih standar
Sebagian besar contoh kode C # yang saya lihat akhir-akhir ini digunakan var
, yang pada dasarnya adalah singkatan Child
.
Parent obj = new Child(); // Sub-optimal
Child obj = new Child(); // Optimal, but anti-pattern syntax
var obj = new Child(); // Optimal, clean, patterned syntax "everyone" uses now
Melihat var
pernyataan non- deklarasi sama sekali tidak terlihat; jika ada alasan situasional untuk itu, mengagumkan, tetapi sebaliknya itu terlihat anti-pola.
// Clean:
var foo1 = new Person();
var foo2 = new Job();
var foo3 = new Residence();
// Staggered:
Person foo1 = new Person();
Job foo2 = new Job();
Residence foo3 = new Residence();
Keuntungan 4: Lebih banyak logika program yang bisa berubah untuk prototyping
Tiga keuntungan pertama adalah yang besar; ini jauh lebih situasional.
Namun, untuk orang yang menggunakan kode seperti orang lain menggunakan Excel, kami terus mengubah kode kami. Mungkin kita tidak perlu memanggil metode unik untuk Child
di ini versi kode, tapi kami mungkin menggunakan kembali atau ulang kode nanti.
Keuntungan dari sistem tipe yang kuat adalah bahwa ia memberi kami meta-data tertentu tentang logika program kami, membuat kemungkinan lebih mudah terlihat. Ini sangat berguna dalam pembuatan prototipe, jadi yang terbaik adalah simpan sedapat mungkin.
Ringkasan
Menggunakan Parent
resolusi metode overloaded yang berantakan, menghambat beberapa optimisasi kompiler, menghapus informasi dari pembaca, dan membuat kode lebih jelek.
Menggunakan var
benar-benar cara untuk pergi. Cepat, bersih, berpola, dan membantu kompiler dan IDE untuk melakukan pekerjaan mereka dengan benar.
Penting : Jawaban ini tentangParent
vs.Child
dalam lingkup lokal metode. MasalahParent
vsChild
sangat berbeda untuk jenis kembali, argumen, dan bidang kelas.