c# 重写和new 隐藏的区别

在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`关键字隐藏基类成员有一些区别。下面是它们的区别:

  1. 重写(override):

    • 重写是用于在派生类中重新定义基类中已经定义的方法、属性或索引器。
    • 重写的方法必须使用override关键字标记,并且必须具有与基类成员相同的签名。
    • 当调用派生类实例的重写方法时,实际上会调用派生类中的实现,而不是基类中的实现。
    • 重写是面向对象编程中实现多态性的一种方式,可以实现运行时多态性。
  2. 使用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关键字隐藏基类成员则是为了在派生类中添加新的成员或者对基类成员进行隐藏。