virtual (Referensi C#)
Kata kunci virtual
digunakan untuk memodifikasi metode, properti, pengindeks, atau deklarasi peristiwa dan memungkinkannya ditimpa di kelas turunan. Misalnya, metode ini dapat ditimpa oleh kelas mana pun yang mewarisinya:
public virtual double Area()
{
return x * y;
}
Implementasi anggota virtual dapat diubah oleh anggota yang menimpa 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 run-time objek diperiksa untuk anggota yang menimpa. Anggota yang menimpa di kelas yang paling diturunkan dipanggil, yang mungkin anggota asli, jika tidak ada kelas turunan yang menimpa anggota.
Secara default, metode bersifat tidak virtual. Anda tidak dapat menimpa 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 ditimpa 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 penimpaan 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 = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}
/*
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#.