Apa perbedaan antara mendeklarasikan metode dalam tipe dasar " virtual
" dan kemudian menimpanya dalam tipe anak menggunakan " override
" kata kunci dibandingkan dengan hanya menggunakan new
kata kunci " " ketika mendeklarasikan metode pencocokan dalam tipe anak?
c#
syntax
overriding
method-hiding
member-hiding
i3ensays
sumber
sumber
new
membuat anggota baru dengan nama yang sama dan menyebabkan anggota asli menjadi tersembunyi, sementaraoverride
memperluas implementasi untuk anggota yang diwariskan"Jawaban:
Kata kunci "baru" tidak menggantikan, itu menandakan metode baru yang tidak ada hubungannya dengan metode kelas dasar.
Ini mencetak false, jika Anda menimpanya akan dicetak benar.
(Kode dasar diambil dari Joseph Daigle)
Jadi, jika Anda melakukan polimorfisme nyata, Anda HARUS SELALU BERLEBIHAN . Satu-satunya tempat di mana Anda perlu menggunakan "baru" adalah ketika metode ini tidak terkait dengan cara apa pun dengan versi kelas dasar.
sumber
virtual
di pangkalan danoverride
diturunkan? Kenapa itu ada? Kode masih akan berjalan bahkan tanpanew
- jadi apakah ini murni keterbacaan saja?Saya selalu menemukan hal-hal seperti ini lebih mudah dipahami dengan gambar:
Sekali lagi, mengambil kode joseph daigle,
Jika Anda memanggil kode seperti ini:
CATATAN: Yang penting adalah bahwa objek kita sebenarnya a
Bar
, tetapi kita menyimpannya dalam variabel tipeFoo
(ini mirip dengan menuangnya)Maka hasilnya adalah sebagai berikut, tergantung pada apakah Anda menggunakan
virtual
/override
ataunew
ketika mendeklarasikan kelas Anda.sumber
Berikut ini beberapa kode untuk memahami perbedaan dalam perilaku metode virtual dan non-virtual:
sumber
new
untuk "menyembunyikan" metode dasar, ketika tidak menggunakan override tampaknya melakukan hal yang sama?virtual
dan kompiler akan mengeluh jika melihat nama fungsi yang sama pada kelas "garis keturunan" tanpavirtual
tanda tanganKata
new
kunci sebenarnya membuat anggota yang sama sekali baru yang hanya ada pada jenis tertentu.Misalnya
Metode ini ada pada kedua jenis. Ketika Anda menggunakan refleksi dan mendapatkan anggota tipe
Bar
, Anda akan benar-benar menemukan 2 metodeDoSomething()
yang terlihat persis sama. Dengan menggunakannew
Anda secara efektif menyembunyikan implementasi di kelas dasar, sehingga ketika kelas berasal dariBar
(dalam contoh saya) panggilan metode untukbase.DoSomething()
pergi keBar
dan tidakFoo
.sumber
virtual / override memberitahu kompiler bahwa kedua metode terkait dan bahwa dalam beberapa keadaan ketika Anda akan berpikir Anda memanggil metode pertama (virtual) itu benar untuk memanggil metode kedua (override) sebagai gantinya. Ini adalah dasar dari polimorfisme.
Akan memanggil metode VirtualFoo () utama SubClass.
baru memberitahu kompiler bahwa Anda menambahkan metode ke kelas turunan dengan nama yang sama dengan metode di kelas dasar, tetapi mereka tidak memiliki hubungan satu sama lain.
Akan memanggil metode NewBar () BaseClass, sedangkan:
Akan memanggil metode NewCar () SubClass.
sumber
Selain detail teknis, saya pikir menggunakan virtual / override mengkomunikasikan banyak informasi semantik pada desain. Ketika Anda mendeklarasikan metode virtual, Anda mengindikasikan bahwa Anda berharap bahwa kelas implementasi mungkin ingin menyediakan implementasi mereka sendiri, non-default. Menghilangkan ini dalam kelas dasar, juga, menyatakan harapan bahwa metode default harus mencukupi untuk semua kelas implementasi. Demikian pula, seseorang dapat menggunakan deklarasi abstrak untuk memaksa kelas implementasi untuk menyediakan implementasi mereka sendiri. Sekali lagi, saya pikir ini banyak berkomunikasi tentang bagaimana programmer mengharapkan kode yang akan digunakan. Jika saya menulis basis dan kelas implementasi dan mendapati diri saya menggunakan yang baru, saya serius akan memikirkan kembali keputusan untuk tidak membuat metode virtual pada orang tua dan menyatakan maksud saya secara khusus.
sumber
Perbedaan antara kata kunci override dan kata kunci baru adalah bahwa yang pertama melakukan overriding metode dan kemudian yang bersembunyi metode.
Lihat tautan berikut untuk informasi lebih lanjut ...
MSDN dan Lainnya
sumber
new
kata kunci untuk Menyembunyikan. - Berarti Anda menyembunyikan metode Anda saat runtime. Output akan didasarkan pada metode kelas dasar.override
untuk mengganti. - berarti Anda menggunakan metode kelas turunan Anda dengan referensi kelas dasar. Output akan didasarkan pada metode kelas turunan.sumber
Versi penjelasan saya berasal dari penggunaan properti untuk membantu memahami perbedaan.
override
cukup sederhana kan? Jenis yang mendasari menimpa orang tua.new
mungkin menyesatkan (bagi saya itu). Dengan properti lebih mudah dipahami:Menggunakan debugger Anda dapat melihat bahwa
Foo foo
ada 2GetSomething
properti, karena sebenarnya memiliki 2 versi properti,Foo
danBar
', dan untuk mengetahui mana yang akan digunakan, c # "mengambil" properti untuk jenis saat ini.Jika Anda ingin menggunakan versi Bar, Anda akan menggunakan penggantian atau gunakan
Foo foo
sebagai gantinya.Bar bar
hanya memiliki 1 , karena ingin perilaku yang sama sekali baru untukGetSomething
.sumber
Tidak menandai metode dengan apa pun berarti: Bind metode ini menggunakan tipe kompilasi objek, bukan tipe runtime (pengikatan statis).
Menandai metode dengan
virtual
cara: Bind metode ini menggunakan tipe runtime objek, bukan tipe waktu kompilasi (pengikatan dinamis).Menandai
virtual
metode kelas dasar denganoverride
kelas turunan berarti: Ini adalah metode yang akan diikat menggunakan tipe runtime objek (pengikatan dinamis).Menandai
virtual
metode kelas dasar dengannew
kelas turunan berarti: Ini adalah metode baru, yang tidak memiliki hubungan dengan yang memiliki nama yang sama di kelas dasar dan harus diikat menggunakan jenis waktu kompilasi objek (pengikatan statis).Tidak menandai
virtual
metode kelas dasar dalam kelas turunan berarti: Metode ini ditandai sebagainew
(pengikatan statis).Menandai metode
abstract
berarti: Metode ini virtual, tetapi saya tidak akan mendeklarasikan sebuah tubuh untuk itu dan kelasnya juga abstrak (pengikatan dinamis).sumber