Tidak, Anda tidak dapat mengganti metode non-virtual. Hal terdekat yang dapat Anda lakukan adalah menyembunyikan metode dengan membuat newmetode 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 Mmetode 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.Foodalam kasus itu, CLR akan dengan benar menentukan jenis objek yang bdirujuk referensi sebagai Bardan akan mengirimkan panggilan dengan Mtepat.