在C#中,重写(override)是指在派生类中重新定义基类中已经定义的方法、属性或索引器。通过重写,派生类可以提供自己的实现逻辑,并覆盖基类中的实现。
要在C#中重写基类成员,需要使用关键字override
来标记派生类中的新实现。例如,可以使用以下代码重写基类的方法:
class BaseClass
{
public virtual void SomeMethod()
{
Console.WriteLine("BaseClass SomeMethod");
}
}
class DerivedClass : BaseClass
{
public override void SomeMethod()
{
Console.WriteLine("DerivedClass SomeMethod");
}
}
在上面的例子中,DerivedClass
重写了SomeMethod
方法,并提供了自己的实现。当使用DerivedClass
的实例调用SomeMethod
方法时,会执行DerivedClass
中的实现。
需要注意的是,重写的方法必须具有与基类成员相同的签名,并且必须使用override
关键字进行标记。否则,编译器将会报错。
在C#中,重写(override)和使用`new`关键字隐藏基类成员有一些区别。下面是它们的区别:
-
重写(override):
- 重写是用于在派生类中重新定义基类中已经定义的方法、属性或索引器。
- 重写的方法必须使用
override
关键字标记,并且必须具有与基类成员相同的签名。 - 当调用派生类实例的重写方法时,实际上会调用派生类中的实现,而不是基类中的实现。
- 重写是面向对象编程中实现多态性的一种方式,可以实现运行时多态性。
-
使用
new
隐藏:- 使用
new
关键字是用于在派生类中隐藏基类中已经定义的方法、属性或索引器。 - 使用
new
关键字的方法不会覆盖基类的方法,而是在派生类中创建一个新的同名成员。 - 当调用派生类实例的隐藏方法时,实际上会调用派生类中的新实现,而不是基类中的实现。但在基类的引用下调用派生类实例的隐藏方法时,实际上会调用基类中的实现**。
- 使用
new
关键字可以在不破坏原有继承关系的情况下在派生类中添加新的成员或者对基类成员进行隐藏。
- 使用
void Main()
{
animal a=new animal();
a.voice();//动物的声音
animal a1=new dog();
a1.voice();//狗狗的声音
animal a2=new cat();
//当调用派生类实例的隐藏方法时,实际上会调用派生类中的新实现,而不是基类中的实现。但在基类的引用下调用派生类实例的隐藏方法时,实际上会调用基类中的实现
a2.voice();//动物的声音
}
class animal{
public virtual void voice(){
Console.WriteLine("动物的声音");
}
}
class dog : animal
{
public override void voice()
{
Console.WriteLine("狗狗的声音");
}
}
class cat:animal{
public new void voice(){
Console.WriteLine("猫的声音");
}
}
总的来说,重写是实现多态性的一种方式,而使用new
关键字隐藏基类成员则是为了在派生类中添加新的成员或者对基类成员进行隐藏。