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.
virtual Gunakan kata kunci untuk mengubah metode, properti, pengindeks, atau deklarasi peristiwa dan memungkinkan kelas turunan untuk mengambil alihnya.
Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.
Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.
Petunjuk / Saran
Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.
Misalnya, kelas apa pun yang mewarisi metode ini dapat mengambil alihnya:
public virtual double Area()
{
return x * y;
}
Anggota pengganti di kelas turunan dapat mengubah implementasi anggota virtual. 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.
Saat Anda memanggil metode virtual, runtime memeriksa jenis objek untuk anggota penggantian. Ini memanggil anggota penimpaan di kelas yang paling turunan. Jika tidak ada kelas turunan yang mengambil alih anggota, anggota asli akan dipanggil.
Secara default, metode bersifat tidak virtual. Anda tidak dapat mengambil alih 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, Shape kelas berisi dua koordinat x dan y, dan Area() metode virtual. 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().
Kelas yang diwariskan Circle, , Cylinderdan Sphere 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#.