方法重写
什么是方法重写?子类中对父类的方法进行重新编写,并覆盖掉从父类继承的方法
。
过程:当子类继承父类的方法时,也会具有父类方法,如果对父类的方法不能实现子类的需求,可以再子类中重新写一个和父类相同的方法来实现子类的需求,这样子类就会有两个一模一样的方法,子类一般调用自己类的方法。实际上父类方法还是存在的。‘
new关键字:
可以隐藏从基类里面继承的成员,派生类的成员将替代基类的成员,去除警告.
base关键字
: 调用父类的方法,可以是构造方法,和一般方法
构造方法:构造函数:base(参数)
一般方法:base.方法名
virtual关键字:
在父类表示可能被重写的方法。
override关键字
:用子类中的重写方法覆盖掉从父类继承的方法。
class A
{
public A(string str) //写了父类的构造方法,默认的无参构造函数被覆盖了
{
Console.WriteLine("A的"+str);
}
public void PrintInfo()
{
Console.WriteLine("我是A的PrintInfo");
}
}
class B : A
{
public B(string str):base(str) //base可以调用父类构造方法,子类实例化父类的构造方法
{
Console.WriteLine("B的"+str);
}
public new void PrintInfo()
{
base.PrintInfo(); //调用父类的方法
Console.WriteLine("B的PrintInfo");
}
}
class Program
{
static void Main(string[] args)
{
B b = new B("B");
b.PrintInfo();
PrintB(b);
Console.ReadKey();
}
//输出打印指定对像的所有的方法名
static void PrintB(B b)
{
Type t = b.GetType();
MethodInfo[] infos = t.GetMethods();
foreach (MethodInfo info in infos)
{
Console.WriteLine("B的成员:"+info.Name);
}
}
}
结果:
B有两个PrintInf方法
接下来使用Virtual
和Override
class A
{
public A(string str) //写了父类的构造方法,默认的无参构造函数被覆盖了
{
Console.WriteLine("A的"+str);
}
public virtual void PrintInfo()
{
Console.WriteLine("我是A的PrintInfo");
}
}
class B : A
{
public B(string str):base(str) //base可以调用父类构造方法,子类实例化父类的构造方法
{
Console.WriteLine("B的"+str);
}
public override void PrintInfo()
{
base.PrintInfo(); //调用父类的方法
Console.WriteLine("B的PrintInfo");
}
}
static void Main(string[] args)
{
B b = new B("B");
b.PrintInfo();
PrintB(b);
Console.ReadKey();
}
//输出打印指定对像的所有的方法名
static void PrintB(B b)
{
Type t = b.GetType();
MethodInfo[] infos = t.GetMethods();
foreach (MethodInfo info in infos)
{
Console.WriteLine("B的成员:"+info.Name);
}
}
输出结果:
B里面从父类继承的方法被覆盖了