using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 重载_重写
{
//在同一个类中的重载(overLoad)
class Parent //构成重载的条件必须是函数名相同,参数的类型不同,或者参数的类型相同,但参数的个数不同
{
public int Add(int x, int y)
{
return x + y;
}
public double Add(double x, double y)
{
return x - y;
}
public int Add(int x)//隐藏的例子
{
return x;
}
//public int Add(int a, int b)// 错误。参数类型与个数相同,即便参数名称不同也能不构成重载。
//{
// return a + b;
//}
//下面是讲解重写(OverRide)的
public virtual void OverRideF()
{
Console.WriteLine("这是父类的方法");
}
}
class Child : Parent
{
public int Add(int x, int y, int z) //此方法与父类(Parent)的Add方法构成了重载(OverLoad)(对比父类方法,讲解重载的)
{
return x + y + z;
}
public new int Add(int x) //此方法与父类的Add(int x) 方法构成了隐藏(Hide)。这时会受到vs的警告:“重载_重写.Child.Add(int)”隐藏了继承的成员“重载_重写.Parent.Add(int)”。如果是有意隐藏,请使用关键字 new。所以为了代码符合C#语法规范,我们在 public后面添加一个new。“new”关键字明确告诉C#编译器,子类隐藏父类的同名方法,提供自己的新版本。 (但是这里的问题来了:如果我子类的方法隐藏了父类的同名方法,那么我想用子类的对象如果不进行强制转而去调用父类的隐藏方法怎么办法呢?于是这里就出现了,为达到这个目的,可以在父类同名方法前加关键字virtual,表明这是一个虚方法,子类可以重写此方法:即在子类同名方法前加关键字override,表明对父类同名方法进行了重写(overRide)。这个重写我们重新开篇来讲)
{
return x;
}
public override void OverRideF() //对比父类方法,讲解重写的(overRide)。
{
Console.WriteLine("这是子类中的方法");
}
}
class Program
{
static void Main(string[] args)
{
Child c = new Child();
Console.WriteLine(c.Add(6.55144, 5));//正确,子类的对象是可以调用父类的重载方法的
Console.WriteLine(c.Add(5, 6));
Console.WriteLine(c.Add(5, 6, 7));//调用子类的重载方法
c.OverRideF(); //子类调用重写方法,输出的是:这是子类中的方法
Parent p = new Parent();
p.OverRideF();//父类调用OverRideF方法,输出的是:这是父类的方法。这一示例表明,将父类方法定义为虚方法,子类重写同名方法之后,通过父类变量调用此方法,到底是调用父类还是子类的,由父类变量引用的真实对象类型决定,而与父类变量无关!
//p.Add(5,6,7);//错误,父类的对象无法调用子类的方法(因为含有三个参数的方法只有子类中有,父类中没有)
//p = c;//子类的对象可以赋给父类的对象。
//c = p;//错误,父类的对象不能赋值给子类的对象;
Console.ReadKey();
}
}
}
重载(overLoad),重写(overRide),隐藏(hide)
最新推荐文章于 2022-09-13 17:23:38 发布