重写方法,重载方法,虚方法和抽象方法。
重写:指子类重新实现父类的某些方法,以实现一些新的功能。重写的关键字是override。并且重写的方法其签名是相同的。
重载:指允许类中具有相同函数名的方法,但是其函数签名必须是唯一的(顺序,个数等)。重载的方法是在被调用的时候通过函数签名确定需要调用哪一个方法。
虚方法:若一个实例方法的声明中含有virtual修饰符,则称该方法为虚方法(virtual method)。在调用一个虚方法时,该调用所涉及的那个实例的运行时类型
(runtime type)确定了要被调用的究竟是该方法的哪一个实现。
抽象方法:抽象方法是没有实现的虚方法。抽象方法只能存在于抽象类中。抽象方法使用abstract修饰符进行声明。
抽象方法只提供函数的声明,至于函数的实现,必须要在子类中通过重写实现。
重写和虚方法:C#中的多态性在实现时主要是通过在子类(派生类)中重写基类的虚方法或函数成员来实现的,那么这里就遇到两个概念,一个是虚方法,另一个是重写方法,而这两个方法也是多态中最重要的两个概念,下面分别对它们进行讲解。
1.虚方法
虚方法就是允许被其子类重新定义的方法,在声明时,需要使用virtual修饰符。
注意:
(1)virtual修饰符不能与static、abstract或者override修饰符同时使用;
(2)由于虚方法不能是私有的,所以,virtual修饰符不能与private修饰符同时使用。
例 使用virtual修饰符声明一个虚方法,用来计算两个数的和,代码如下:
public virtual int Add(int x, int y) //定义一个虚方法
{
return x + y; //返回两个数的和
}
2.重写方法
如果一个方法声明中含有override修饰符,则称该方法为重写方法,它主要用来使用相同的签名重写继承的虚方法。虚方法主要用来引入新方法,而重写方法则使从基类继承而来的虚方法专用化(提供虚方法的具体实现)。
注意:
(1)override修饰符不能与new、static或者virtual修饰符同时使用,另外,重写方法只能用于重写基类中的虚方法,不能用来单独声明方法;
(2)重载和重写是不相同的,重载是指编写一个与已有方法同名,但参数列表不同的方法,而重写是指在派生类中重写基类的虚方法。
例 创建一个控制台应用程序,首先定义一个基类,并在其中定义一个虚方法,用来计算两个数的和;然后使Program类继承于BaseClass类,并在该类中重写基类中的虚方法,使其实现计算3个数的和;最后在Main方法中,使用派生类对象实例化基类的一个对象,并使用该基类对象调用派生类中的方法,实现计算3个数的和。代码如下:
class BaseClass //定义一个基类
{
public virtual int Add(int x, int y) //定义一个虚方法
{
return x + y; //返回两个数的和
}
}
class Program:BaseClass //定义一个派生类,继承于BaseClass
{
static int z = 0; //定义一个静态变量,用来作为第3个被加数
public override int Add(int x, int y) //重写基类中的虚方法
{
return base.Add(x, y) + z; //计算3个数的和
}
static void Main(string[] args)
{
z = 698; //为静态变量赋值
BaseClass baseclass = new Program(); //使用派生类对象实例化基类对象
Console.WriteLine(baseclass.Add(98, 368)); //调用派生类中重写之后的方法
Console.ReadLine();
}
}
说明:
在Main方法中使用基类对象调用的Add方法是在派生中重写之后的方法,这主要是因为虚方法的实现由派生类中的重写方法进行了取代。
技巧:
在派生类中重写基类中的虚方法时,可以使用base关键字调用基类中的虚方法。
重写方法,重载方法,虚方法和抽象方法例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Override_Test { class Program { static void Main(string[] args) { //抽象类不能实例化 fatherClass father = new childClass(); childClass child = new childClass(); Console.WriteLine("fatherClass的Add方法:" + father.Add(1, 2)); //执行ChildClass中的Add方法 Console.WriteLine("childClass重写fatherClass中的虚方法Add:" + child.Add(1, 2)); //执行ChildClass中的Add方法 Console.WriteLine("childClass重载Add方法:"+child.Add(1)); Console.WriteLine("childClass重载Add方法:" + child.Add(1,3,5)); Console.WriteLine("childClass重写fartherClass中的抽象方法Add:" + father.StringFun("抽象方法")); //执行ChildClass中的StringFun方法 } } abstract class fatherClass { //构造 public fatherClass() { } //虚方法 public virtual int Add(int i, int j) { return i + j; } //抽象方法 public abstract string StringFun(string str); } class childClass : fatherClass { //构造 public childClass() { } //重写父类虚方法Add 被重写的父类方法 必须是virtual , abstract方法 public override int Add(int i, int j) { return i*2 + j; } public int Add(int i ) { return i; } public int Add(int i, int j, int k) { return i+j+k; } //重写父类的抽象方法 public override string StringFun(string str) { return str; } } }
以上参考两位博主:https://www.cnblogs.com/gq0324/p/8177645.html
https://www.cnblogs.com/ShuiMu/archive/2011/07/24/2115570.html
来源:https://www.cnblogs.com/HenryWEI/p/9663870.html