重写(override):
从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。其实重写并不改变父类的方法代码。父类中用关键字Virtual修饰的方法,叫做虚方法。在子类中可以使用同名的方法,用关键字Override声明即可,这就叫做方法的“重写”。(相应的没有用关键字Virtual修饰的方法,我们称为实方法)。重写虽不改变代码,但是改变父类方法的功能。
class Program
{
static void Main(string[] args)
{
A A1 = new A();
Console.WriteLine(A1.Say());//显示结果为“你好!!”
B B1 = new B();
Console.WriteLine(B1.Say());//显示结果为“hello!!”
A C1 = new B();//调用的为重写之后的方法,将父类的方法修改。
Console.WriteLine(C1.Say());//显示结果为“hello!!”
Console.ReadKey();
}
public class A //定义一个新方法
{
public virtual string Say() //虚方法
{
return "你好!!";
}
}
public class B:A //方法B对方法A进行重写。
{
public override string Say() //重写方法
{
return "hello!!";
}
}
}
覆盖:
从字面意思理解,就是将原来父类的方法进行了覆盖,仅仅是覆盖而已。在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。与重写不同的是,覆盖既不会改变父类中的代码也不会改变父类方法的功能。重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。
class Program
{
static void Main(string[] args)
{
A A1 = new A();
Console.WriteLine(A1.Say());//显示结果为“你好!!”
B B1 = new B();
Console.WriteLine(B1.Say());//显示结果为“hello!!”
A C1 = new B();//调用的为覆盖之前的方法,父类的方法没有修改。
Console.WriteLine(C1.Say());//显示结果为“你好!!”
Console.ReadKey();
}
public class A//定义一个新方法
{
public string Say()
{
return "你好!!";
}
}
public class B : A//方法B对方法A进行覆盖。
{
public string Say()
{
return "hello!!"; //覆盖方法A
}
}
}
重载(overload):
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,会根据不同的参数样式,来选择合适的方法执行。方法的重载和参数的类型和个数有关,和返回值无关。重载:参数值不同或者参数个数不同均可。
public static int Number(int num1)
{
return num1;
}
public static int Number(int num1,int num2)
{
return num1 + num2;
}