Saat melakukan refactoring, saya akhirnya membuat metode seperti contoh di bawah ini. Jenis data telah diubah demi kesederhanaan.
Saya sebelumnya memiliki pernyataan tugas seperti ini:
MyObject myVar = new MyObject();
Itu direfraktorisasi menjadi ini secara tidak sengaja:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Ini adalah hasil dari kesalahan potong / tempel di pihak saya, tetapi new
kata kunci dalam private static new
valid dan dapat dikompilasi.
Pertanyaan : Apa arti new
kata kunci dalam tanda tangan metode? Saya berasumsi itu adalah sesuatu yang diperkenalkan di C # 3.0?
Apa bedanya dengan ini override
?
new
sebagai pengubah pada metode (atau anggota tipe lain) bukanlah "sesuatu yang diperkenalkan di C # 3.0". Itu sudah ada sejak versi pertama C #.Jawaban:
Referensi kata kunci baru dari MSDN:
Referensi MSDN
Berikut adalah contoh yang saya temukan di internet dari Microsoft MVP yang masuk akal: Tautan ke Asli
Penimpaan hanya dapat digunakan dalam kasus yang sangat spesifik. Dari MSDN:
Jadi kata kunci 'baru' diperlukan untuk memungkinkan Anda 'menimpa' metode non-virtual dan statis.
sumber
new
itu, tetapi saya pikir itu benar-benar hanya ada untuk dibaca - kompiler hanya memperingatkan Anda bahwa ketika Anda memanggil metode kelas turunan dengan nama yang sama sebagai basis, Anda tidak akan mendapatkan metode kelas dasar yang mungkin Anda lakukan. pikir .... itu aneh ... murni untuk dibaca?IMyInterface
, implementasi pada kelas Derived akan dipanggil. Dengan demikianIMyInterface c = new B()
akan memanggil implementasi kelas B. Jika hanya satu kelas yang mengimplementasikan antarmuka, metode dari kelas yang mengimplementasikannya akan dipanggil.Tidak, ini sebenarnya bukan "baru" (maafkan permainan kata). Ini pada dasarnya digunakan untuk "menyembunyikan" metode. YAITU:
Jika Anda kemudian melakukan ini:
Metode di Basis adalah salah satu yang akan dipanggil, BUKAN yang diturunkan.
Beberapa info lebih lanjut: http://www.akadia.com/services/dotnet_polymorphism.html
Re-edit Anda: Dalam contoh yang saya berikan, jika Anda "menimpa" daripada menggunakan "baru" maka saat Anda memanggil b.Method (); Metode kelas Turunan akan disebut karena Polimorfisme.
sumber
Seperti yang dijelaskan orang lain, ini digunakan untuk menyembunyikan metode yang sudah ada. Ini berguna untuk mengganti metode yang bukan virtual di kelas induk.
Ingatlah bahwa membuat anggota "baru" tidak bersifat polimorfik. Jika Anda mentransmisikan objek ke tipe dasar, itu tidak akan menggunakan anggota tipe turunan.
Jika Anda memiliki kelas dasar:
Dan kemudian kelas turunannya:
Jika Anda mendeklarasikan sebuah tipe
DerivedType
dan kemudian mentransmisikannya, metodeDoSomething()
tersebut bukan polimorfik, metode ini akan memanggil metode kelas dasar, bukan yang diturunkan.sumber
override
tanda tangan dalam metodenew
menyembunyikan tipe dasar dari tipe turunan, karena tidak bisakah Anda selalu mengakses tipe dasar menggunakanbase.<type>
notasi?base.<method>
, dan juga bisa dipanggil secara eksternal jika Anda mentransmisikan ke tipe dasar dalam kode Anda. Lebih akurat secara teknis untuk menganggapnya sebagai "mengesampingkan" metode dasar daripada "menyembunyikannya".Dari dokumen:
Jika metode di kelas turunan diawali dengan kata kunci baru, metode tersebut didefinisikan sebagai metode independen di kelas dasar.
Artinya dalam praktik:
Jika Anda mewarisi dari kelas lain dan Anda memiliki metode yang berbagi tanda tangan yang sama, Anda dapat mendefinisikannya sebagai 'baru' sehingga independen dari kelas induk. Artinya jika Anda memiliki referensi ke kelas 'induk' maka implementasi tersebut akan dijalankan, jika Anda memiliki referensi ke kelas anak maka implementasi tersebut akan dijalankan.
Secara pribadi saya mencoba untuk menghindari kata kunci 'baru' karena biasanya berarti saya memiliki hierarki kelas yang salah, tetapi ada kalanya hal itu dapat berguna. Satu tempat untuk versi dan kompatibilitas mundur.
Ada banyak informasi di MSDN untuk ini .
sumber
new
keberadaannya. Ini sintaksis / keterbacaan.Artinya metode tersebut menggantikan metode dengan nama yang sama yang diwarisi oleh kelas dasar. Dalam kasus Anda, Anda mungkin tidak memiliki metode dengan nama itu di kelas dasar, yang berarti kata kunci baru sama sekali tidak berguna.
sumber
Singkat cerita - TIDAK diperlukan, TIDAK mengubah perilaku, dan MURNI ada untuk dibaca.
Itulah mengapa di VS Anda akan melihat sedikit berlekuk-lekuk, namun kode Anda akan dikompilasi dan berjalan dengan baik dan seperti yang diharapkan.
Seseorang harus bertanya-tanya apakah itu benar-benar layak membuat
new
kata kunci ketika semua artinya adalah pengembang yang mengakui "Ya, saya tahu saya menyembunyikan metode dasar, ya saya tahu saya tidak melakukan apa pun yang berhubungan denganvirtual
atauoverriden
(polimorfisme) - Saya benar-benar ingin membuat metodenya sendiri ".Agak aneh bagi saya, tetapi mungkin hanya karena saya berasal dari
Java
latar belakang dan ada perbedaan mendasar antaraC#
inheritance danJava
: DalamJava
, metode virtual secara default kecuali ditentukan olehfinal
. DalamC#
, metode bersifat final / konkret secara default kecuali ditentukan olehvirtual
.sumber
Dari MSDN :
sumber
Hati-hati dengan gotcha ini.
Anda memiliki metode yang ditentukan dalam antarmuka yang diimplementasikan di kelas dasar. Anda kemudian membuat kelas turunan yang menyembunyikan metode antarmuka, tetapi tidak secara khusus mendeklarasikan kelas turunan sebagai mengimplementasikan antarmuka. Jika Anda kemudian memanggil metode melalui referensi ke antarmuka, metode kelas dasar akan dipanggil. Namun jika kelas turunan Anda secara khusus mengimplementasikan antarmuka, maka metodenya akan dipanggil jenis referensi mana pun yang digunakan.
sumber