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.
Gunakan pengubah override untuk memperluas atau memodifikasi implementasi abstrak atau virtual dari metode, properti, pengindeks, atau peristiwa yang diwariskan.
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#.
Dalam contoh berikut, Square kelas harus memberikan implementasi GetArea yang ditimpa karena GetArea diwarisi dari kelas abstrak Shape :
abstract class Shape
{
public abstract int GetArea();
}
class Square : Shape
{
private int _side;
public Square(int n) => _side = n;
// GetArea method is required to avoid a compile-time error.
public override int GetArea() => _side * _side;
static void Main()
{
var sq = new Square(12);
Console.WriteLine($"Area of the square = {sq.GetArea()}");
}
}
// Output: Area of the square = 144
Metode override menyediakan implementasi baru dari metode yang diwariskan dari kelas dasar.
override Deklarasi metode memberikan implementasi yang lebih spesifik dari metode dasar yang ditimpa. Metode override harus memiliki tanda tangan yang sama dengan metode dasar yang ditimpa.
override metode mendukung jenis pengembalian kovarian. Secara khusus, jenis override pengembalian metode dapat berasal dari jenis pengembalian metode dasar yang sesuai.
Anda tidak dapat mengambil alih metode non-virtual atau statis. Metode dasar yang ditimpa harus virtual, , abstractatau override.
override Deklarasi tidak dapat mengubah aksesibilitas virtual metode.
override Metode dan virtual metode harus memiliki pengubah tingkat akses yang sama.
Anda tidak dapat menggunakan newpengubah , , staticatau virtual untuk memodifikasi override metode.
Deklarasi properti penggantian harus menentukan pengubah akses, jenis, dan nama yang sama persis dengan properti yang diwariskan. Properti penggantian baca-saja mendukung jenis pengembalian kovarian. Properti yang ditimpa harus virtual, , abstractatau override.
Untuk informasi selengkapnya tentang cara menggunakan override kata kunci, lihat Penerapan versi dengan Penimpaan dan Kata Kunci Baru dan Mengetahui kapan harus menggunakan Ambil Alih dan Kata Kunci Baru. Untuk informasi tentang pewarisan, lihat Warisan.
Contoh
Contoh ini mendefinisikan kelas dasar bernama Employee dan kelas turunan bernama SalesEmployee. Kelas SalesEmployee ini mencakup bidang tambahan, salesbonus, dan mengambil alih metode CalculatePay untuk memperhitungkan bonus.
class TestOverride
{
public class Employee
{
public string Name { get; }
// Basepay is defined as protected, so that it may be
// accessed only by this class and derived classes.
protected decimal _basepay;
// Constructor to set the name and basepay values.
public Employee(string name, decimal basepay)
{
Name = name;
_basepay = basepay;
}
// Declared virtual so it can be overridden.
public virtual decimal CalculatePay()
{
return _basepay;
}
}
// Derive a new class from Employee.
public class SalesEmployee : Employee
{
// New field that will affect the base pay.
private decimal _salesbonus;
// The constructor calls the base-class version, and
// initializes the salesbonus field.
public SalesEmployee(string name, decimal basepay, decimal salesbonus)
: base(name, basepay)
{
_salesbonus = salesbonus;
}
// Override the CalculatePay method
// to take bonus into account.
public override decimal CalculatePay()
{
return _basepay + _salesbonus;
}
}
static void Main()
{
// Create some new employees.
var employee1 = new SalesEmployee("Alice", 1000, 500);
var employee2 = new Employee("Bob", 1200);
Console.WriteLine($"Employee1 {employee1.Name} earned: {employee1.CalculatePay()}");
Console.WriteLine($"Employee2 {employee2.Name} earned: {employee2.CalculatePay()}");
}
}
/*
Output:
Employee1 Alice earned: 1500
Employee2 Bob earned: 1200
*/
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian Ambil alih metode dari spesifikasi bahasa C#.
Untuk informasi selengkapnya tentang jenis pengembalian kovarian, lihat catatan proposal fitur.