Tidak, Anda tidak dapat mengganti metode non-virtual. Hal terdekat yang dapat Anda lakukan adalah menyembunyikan metode dengan membuat new
metode dengan nama yang sama tetapi ini tidak disarankan karena melanggar prinsip desain yang baik.
Tetapi bahkan menyembunyikan metode tidak akan memberi Anda waktu eksekusi pengiriman polimorfik panggilan metode seperti yang dilakukan oleh panggilan metode virtual yang sebenarnya. Pertimbangkan contoh ini:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
Dalam contoh ini, kedua panggilan ke M
metode cetak Foo.M
. Seperti yang Anda lihat, pendekatan ini memungkinkan Anda untuk memiliki implementasi baru untuk suatu metode selama referensi ke objek tersebut berasal dari jenis turunan yang benar, tetapi menyembunyikan metode dasar tidak merusak polimorfisme.
Saya akan merekomendasikan agar Anda tidak menyembunyikan metode dasar dengan cara ini.
Saya cenderung berpihak pada mereka yang menyukai perilaku default C # yang metodenya non-virtual secara default (sebagai lawan dari Java). Saya akan melangkah lebih jauh dan mengatakan bahwa kelas juga harus disegel secara default. Warisan sulit untuk dirancang dengan benar dan fakta bahwa ada metode yang tidak ditandai sebagai virtual menunjukkan bahwa pembuat metode tersebut tidak pernah bermaksud agar metode tersebut diganti.
Edit: "waktu pelaksanaan pengiriman polimorfik" :
Yang saya maksud dengan ini adalah perilaku default yang terjadi pada waktu eksekusi saat Anda memanggil metode virtual. Katakanlah misalnya bahwa dalam contoh kode saya sebelumnya, daripada mendefinisikan metode non-virtual, saya sebenarnya mendefinisikan metode virtual dan metode overridden yang sebenarnya juga.
Jika saya harus memanggil b.Foo
dalam kasus itu, CLR akan dengan benar menentukan jenis objek yang b
dirujuk referensi sebagai Bar
dan akan mengirimkan panggilan dengan M
tepat.