(一)重写和覆盖:
重写:
在声明时,父类的方法前面加上virtual关键字,子类的方法前面加上override关键字,且与父类方法同名,表示父类的方法可以被子类进行修改和重新定义。
覆盖:
在声明子类方法的时候,添加new关键字,定义与父类同名的方法,称为覆盖。
区别:
当用子类创建父类的时候,重写调用的是子类中的功能,而覆盖调用的仍然是父类的功能。用子类创建子类和用父类创建父类的时候,则相应的进行调用。
下面是当子类创建父类时,重写和覆盖的区别的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 重写和覆盖
{
class Program
{
static void Main(string[] args)
{
C1 c1 = new C2();
Console.WriteLine("重写后的c1应该是:SonOverride; 屏幕显示是:{0}",c1.FClass());
C3 c3 = new C4();
Console.WriteLine("覆盖后的c3应该是:NewFather; 屏幕显示是:{0}", c3.nFClass());
Console.ReadKey();
}
#region 重写方法的函数
public class C1 {
public virtual string FClass() {
return "FatherOverrride";
}
}
public class C2 : C1 {
public override string FClass()
{
return "SonOverride";
}
}
#endregion
#region 覆盖方法的函数
public class C3 {
public string nFClass() {
return "NewFather";
}
}
public class C4 : C3 {
public new string nFClass()
{
return "NewSon";
}
}
#endregion
}
}
(二)重载和覆盖
重载:
函数重载允许创建多个同名函数,每个函数可使用不同的参数类型。优点是不必显示地指定要使用哪个函数,只需要提供一个数组参数,就可以根据参数类型执行相应的函数。
覆盖:
参考(一)。
区别:
重载是发生在同一个类中,覆盖是发生在一个父类和一个子类之间。
下面是重载的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 函数重载
{
class Program
{
static void Main(string[] args)
{
int[] myArray1 = {1,2,3,100,5,6};
double[] myArray2 = {1.1,50.8,21,3.4,5};
int intmaxVal = MaxValue(myArray1);
double doublemaxVal = MaxValue(myArray2);
Console.WriteLine("int类型的返回最大值为{0}\ndouble类型的返回最大值为{1}",intmaxVal,doublemaxVal);
Console.ReadKey();
}
static int MaxValue(int[] myArray)
{
int maxValue = myArray[0];
for (int i = 0; i < myArray.Length;i++ ) {
if(maxValue<myArray[i]){
maxValue=myArray[i];
}
}
return maxValue;
}
static double MaxValue(double[] myArray)
{
double maxValue = myArray[0];
for (int i = 0; i < myArray.Length; i++)
{
if (maxValue < myArray[i])
{
maxValue = myArray[i];
}
}
return maxValue;
}
}
}
(三)虚方法和抽象方法
虚方法:用virtual关键字
使用方法:
(1)可以在子类(派生类)中用override重写父类(基类)的方法
(2)可以在子类中直接由对象调用,使用基类中的方法
抽象方法:用abstract关键字
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且必须在子类中重写。
http://www.cnblogs.com/LilianChen/archive/2013/03/04/2942634.html