在敲例子的时候,我们经常会需要这个的错误提示:没有找到适合的方法来重写。。那么重写是什么?他和覆盖又有什么区别呢?
重写(override):
概念:重写是重写基类的方法,把父类中的方法变成我们更需要的。在基类的方法中必须要有virtual修饰符(用virtual修饰的方法叫虚方法),而在之类的方法中必须要有override。
格式:
基类中:
<span style="font-size:18px;"><strong>public virtual void myMethod()
{
}
</strong></span>
子类中:
<span style="font-size:18px;"><strong>public override void myMethod()
{
}</strong></span>
重写以后,用基类和子类对象访问myMethod()方法,结果都是访问在子类中重新定义的方法,基类的方法相当于被覆盖掉了。
例如:
<span style="font-size:18px;"><strong>public class A1
{
public virtual string GetName()
{
return "LIFEN";
}
}
public class A2 : A1
{
public override string GetName()
{
return "李芬";
}
}
A1 a1 = new A1();
Console.WriteLine(c1.GetName());//输出“LIFEN”
A2 a2 = new A2();
Console.WriteLine(a2.GetName());//输出“李芬”
A1 a3 = new A2();
Console.WriteLine(a3.GetName());//输出“李芬”
</strong></span>
覆盖:
概念:在子类中用关键字new来修饰的,与父类中同名的方法,叫做覆盖。覆盖不会改变父类方法中的功能。
<span style="font-size:18px;"><strong>public class A1
{
public string GetName()
{
return "LIFEN";
}
}
public class A2 : A1
{
public new string GetName()
{
return "李芬";
}
}
A1 a1 = new A1();
Console.WriteLine(c1.GetName());//输出“LIFEN”
A2 a2 = new A2();
Console.WriteLine(a2.GetName());//输出“李芬”
A1 a3 = new A2();
Console.WriteLine(a3.GetName());//输出“LIFEN”
</strong></span>
重载:
概念:重载指的是同一个类中有俩个或多个名字相同但是参数不同或者是返回值不同的方法,重载没有关键字。如下:
<span style="font-size:18px;"><strong>int eat()
int eat(int a)</strong></span>
区别:
重写发生在基类和派生类中,基类用virtual修饰,派生类用override修饰。
覆盖在之类中写一个和基类一样的名字的非虚函数,但是要求new是关键字
重载是在一个类中,函数名相同,但是参数类型构成重载。