Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kata kunci virtual digunakan untuk memodifikasi deklarasi metode, properti, pengindeks, atau event dan memungkinkannya ditimpa di kelas turunan. Misalnya, metode ini dapat digantikan oleh kelas mana pun yang mewarisinya.
public virtual double Area()
{
return x * y;
}
Implementasi anggota virtual dapat diubah oleh anggota penggantian di kelas turunan. Untuk informasi selengkapnya tentang cara menggunakan kata kunci virtual, lihat Penerapan Versi dengan Penimpaan dan Kata Kunci Baru dan Mengetahui Kapan Harus Menggunakan Penimpaan dan Kata Kunci Baru.
Keterangan
Ketika metode virtual dipanggil, jenis objek saat run-time diperiksa untuk anggota pengganti. Anggota yang menggantikan pada kelas yang paling diturunkan disebut, yang mungkin merupakan anggota asli jika tidak ada kelas turunan yang menggantikan anggota tersebut.
Secara default, metode bersifat tidak virtual. Anda tidak dapat meng-override metode non-virtual.
Contoh berikut menunjukkan properti virtual:
class MyBaseClass
{
// virtual automatically implemented property. Overrides can only
// provide specialized behavior if they implement get and set accessors.
public virtual string Name { get; set; }
// ordinary virtual property with backing field
private int _num;
public virtual int Number
{
get { return _num; }
set { _num = value; }
}
}
class MyDerivedClass : MyBaseClass
{
private string _name;
// Override automatically implemented property with ordinary property
// to provide specialized accessor behavior.
public override string Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrEmpty(value))
{
_name = value;
}
else
{
_name = "Unknown";
}
}
}
}
Properti virtual berperilaku seperti metode virtual, kecuali untuk perbedaan sintaks deklarasi dan pemanggilan.
- Properti virtual yang diwariskan dapat dioverride di kelas turunan dengan menyertakan deklarasi properti yang menggunakan pengubah
override.
Contoh
Dalam contoh ini, kelas Shape berisi dua koordinat x, y, dan metode virtual Area(). Kelas dengan bentuk yang berbeda seperti Circle, Cylinder, dan Sphere mewarisi kelas Shape, dan area permukaan dihitung untuk setiap gambar. Setiap kelas turunan memiliki implementasi penggantian sendiri dari Area().
Perhatikan bahwa kelas Circle, Cylinder, dan Sphere yang diwariskan semua menggunakan konstruktor yang menginisialisasi kelas dasar, seperti yang ditunjukkan dalam deklarasi berikut.
public Cylinder(double r, double h): base(r, h) {}
Program berikut menghitung dan menampilkan area yang sesuai untuk setiap gambar dengan memanggil implementasi metode Area() yang sesuai, berdasarkan objek yang terkait dengan metode.
class TestClass
{
public class Shape
{
public const double PI = Math.PI;
protected double _x, _y;
public Shape()
{
}
public Shape(double x, double y)
{
_x = x;
_y = y;
}
public virtual double Area()
{
return _x * _y;
}
}
public class Circle : Shape
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * _x * _x;
}
}
public class Sphere : Shape
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * _x * _x;
}
}
public class Cylinder : Shape
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * _x * _x + 2 * PI * _x * _y;
}
}
static void Main()
{
double r = 3.0, h = 5.0;
Shape c = new Circle(r);
Shape s = new Sphere(r);
Shape l = new Cylinder(r, h);
// Display results.
Console.WriteLine($"Area of Circle = {c.Area():F2}");
Console.WriteLine($"Area of Sphere = {s.Area():F2}");
Console.WriteLine($"Area of Cylinder = {l.Area():F2}");
}
}
/*
Output:
Area of Circle = 28.27
Area of Sphere = 113.10
Area of Cylinder = 150.80
*/
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.