在C#中,方法的 overload
(重载)、override
(重写)和 overwrite
(此术语在C#中实际上并不常用,可能是对override的误称或者指的是隐藏父类成员,通常使用 new
关键字)是三个经常会混淆使用的概念,它们在功能和用途上各有区别。下面将详细地解释这三个概念的含义和用法。
Overload(重载)
重载是指在同一个类中,方法名相同但是参数列表不同的方式,可以根据不同的参数列表调用不同的方法。重载解决了同一个方法不同场景的使用问题。
例子:
class DemoClass
{
public void Display()
{
Console.WriteLine("Display Method.");
}
public void Display(string message)
{
Console.WriteLine("Display Method with single parameter: " + message);
}
public void Display(string message, int times)
{
for (int i = 0; i < times; i++)
{
Console.WriteLine("Display Method with two parameters: " + message);
}
}
}
在上面的例子中,Display
方法被重载了3次,方法名相同,但参数列表不一致。
Override(重写)
重写是指在派生类中改写基类的方法实现的机制。在基类中使用 virtual
关键字定义方法,而在派生类中使用 override
关键字来重写这个方法。这允许派生类在保持相同的方法名称的同时,提供特定的实现。
例子:
class BaseClass
{
public virtual void ShowMessage()
{
Console.WriteLine("Message from Base Class.");
}
}
class DerivedClass : BaseClass
{
public override void ShowMessage()
{
Console.WriteLine("Message from Derived Class.");
}
}
在这个例子中,DerivedClass
通过使用 override
关键字重写了 BaseClass
中的 ShowMessage
方法。
Overwrite / New Keyword(隐藏)
如果 overwrite
指的是在派生类中隐藏基类的成员,则更合适的术语是使用 new
关键字来隐藏基类的方法或属性。这不是重写父类的成员,而是在派生类中创建一个同名但是完全独立的成员。
例子:
class BaseClass
{
public void Show()
{
Console.WriteLine("Show in Base Class.");
}
}
class DerivedClass : BaseClass
{
public new void Show()
{
Console.WriteLine("Show in Derived Class.");
}
}
这里,派生类 DerivedClass
使用 new
关键字隐藏了基类 BaseClass
中的 Show
方法。
总结
- Overload(重载) 中,方法名相同,参数不同,实现在同一个类中的多态性;
- Override(重写) 是子类改写父类中
virtual
或abstract
方法的实现; - Overwrite (通常称为Hiding/隐藏) 使用
new
关键字在派生类中隐藏基类的成员。
以上概念是面向对象编程中实现多态性和继承的重要基石。理解它们之间的区别对于编写清晰、可维护的代码至关重要。