- 如果签名(参数个数、参数类型、返回类型、方法名)相同的方法在基类中和在基类的派生类中同时出现。但是这个方法在基类中没有virtual关键字,在派生类中没有override关键字,那么派生类就会隐藏基类中的方法。
举个例子:
public class Postion
{
public int X { get; set; }
public int Y { get; set; }
}
public class Shap
{
public Postion Postion { get; set; }
}
public class Ellipse:Shap
{
public void MoveBy(int x,int y)
{
Postion.X += x;
Postion.Y += y;
}
}
- 如果想要扩展基类的功能,并且扩展方法的签名和基类中的一致。这两个方法实现的功能并不同,这个方法可能加virtual也可能不加virtual。那么编译就会给出一个警告:
using System;
namespace test
{
class Program
{
static void Main(string[] args)
{
}
}
public class Postion
{
public int X { get; set; }
public int Y { get; set; }
}
public class Shap
{
public Postion Postion { get; set; }
public void MoveBy(int x,int y)
{
Postion.X =x;
Postion.Y =y;
}
}
public class Ellipse:Shap
{
public void MoveBy(int x,int y)
{
Postion.X += x;
Postion.Y += y;
}
}
}
- 如果基类的MoveBy()方法声明为虚方法,调用时,编译器认为派生类中的方法没有override,所以就将其作为一个独立的方法。那么无论怎么调用用都只会调用基类中的方法·。
- 如果不能避免这种方法的定义,想要避免编译警告就可以使用new关键字隐藏方法。
public class Ellipse:Shap
{
new public void MoveBy(int x,int y)
{
Postion.X += x;
Postion.Y += y;
}
}
- 如果不使用new关键字,就需要重命名该方法,但是如果在之前该方法被其他地方调用了,重命名就行不通了。如果和基类的方法实现的功能一样,那么就可以override他。