override (C# başvurusu)
Devralınan bir yöntemin, özelliğin, dizinlandırıcının veya olayın soyut veya sanal uygulamasını genişletmek veya override değiştirmek için değiştirici gereklidir.
Aşağıdaki örnekte, soyut Square sınıftan devralınmış olduğundan GetArea sınıfının geçersiz GetArea kılınan uygulamasını Shape sağlamalıdır:
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
Yöntem, override temel sınıftan devralınan yöntemin yeni bir uygulamasını sağlar. Bir bildirim tarafından geçersiz kılınan override yöntem, geçersiz kılınan temel yöntem olarak bilinir. Bir override yöntemin geçersiz kılınan temel yöntemiyle aynı imzaya sahip olması gerekir. C# 9.0'dan override itibaren yöntemler birlikte değişken dönüş türlerini destekler. Özellikle, bir yöntemin dönüş override türü karşılık gelen temel yöntemin dönüş türünden türetebilirsiniz. C# 8.0 ve önceki sürümlerinde, bir yöntemin dönüş türleri ve override geçersiz kılınan temel yöntem aynı olması gerekir.
Sanal olmayan veya statik bir yöntemi geçersiz kamazsiniz. Geçersiz kılınan temel yöntem virtual , veya olması abstract override gerekir.
Bildirim, override yönteminin erişilebilirliğini virtual değiştiremez. Hem override yöntemi hem de virtual yöntemi aynı erişim düzeyi değiştiriciye sahip olmalıdır.
Bir yöntemi değiştirmek new için static , veya virtual değiştiricilerini override kullanılamaz.
Geçersiz kılma özelliği bildirimi, devralınan özellikle tam olarak aynı erişim değiştiricisini, türünü ve adını belirtmektedir. C# 9.0'dan itibaren salt okunur geçersiz kılma özellikleri birlikte değişken dönüş türlerini destekler. Geçersiz kılınan özelliği , virtual veya abstract olması override gerekir.
anahtar sözcüğünü kullanma hakkında daha fazla bilgi için bkz. Geçersiz Kılma ve Yeni Anahtar Sözcüklerle Sürüm Ekleme ve Geçersiz Kılma ile Yeni Anahtar Sözcüklerin Ne override Zaman Kullanılacalarını Bilme. Devralma hakkında bilgi için bkz. Devralma.
Örnek
Bu örnek adlı bir temel sınıf ve Employee adlı türetilmiş bir sınıf SalesEmployee tanımlar. sınıfı, SalesEmployee ek bir alan ( ) içerir ve bunu dikkate almak için yöntemini geçersiz salesbonus CalculatePay kılar.
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
*/
C# dili belirtimi
Daha fazla bilgi için C# dil belirtimlerinin Geçersiz kılma yöntemleri bölümüne bakın.
Birlikte değişken dönüş türleri hakkında daha fazla bilgi için özellik teklifi notuna bakın.