1、什么是重写(override):子类对父类中方法进行按照自身需要进行对方法体进行重写,重写方法与父类方法在访问权限、返回值、方法名以及参数不变。
2、什么是重载(overload):在一个类中对同一方法名按照不同的需求编写出多个方法,方法名相同,但是参数的类型或者个数不能相同,返回值类型不能作为重载的标志。
class A
{
public A()
{
Print();
}
public virtual void Print()
{
Console.WriteLine("我是A类");
}
}
class B : A
{
public B()
{
Print();
}
public override void Print()
{
Console.WriteLine("我是B类");
}
}
3、什么条件下才能对父类方法进行重写:父类中方法必须被virtual关键字修饰的方法才能被子类重写,如何父类方法没有使用virtual关键字,在子类中重写父类方法时就会编译错误;在子类中对父类进行重写时,需要使用override关键字作为标识;例如B类继承A类,并重写A类中Print方法时,没有使用override关键字的的话会出现下列的警告。
如果使用new关键字对print方法进行修饰,B类中Print方法则不是对A类中Print方法进行重写,关于这一点我会在下面进行解读。
4、如果父类方法被子类重写之后,通过创建子类对象指向父类时,使用Print方法时,调用的是父类还是子类的方法?
A a = new B();
a.Print();
运行后的结果为:
可以看出,B类中Print方法运行了3次,为什么呢?
在创建B类的实例时,首先会运行类中构造函数,但是会首先执行父类中的构造函数,当执行父类中构造函数中Print方法时,首先判断Print方法是否已经被重写,如果该方法被重写的话,则会执行子类中重写的方法;执行完成父类的构造函数之后,就会执行子类中构造函数,子类构造函数调用Print函数时,首先会判断子类中是否含有Print方法,有的话则会调用自身的Print方法,否则调用父类中Print方法;最后a.Print()也是首先判断A类中Print方法是否被重写,如果被重写的话则调用子类中Print方法。
因此得出的结论是:当父类方法被子类重写之后,只要创建子类的实例,当调用被重写的方法时,最终运行的都是子类中的方法。
5、如果子类中的Print方法被new关键字而不是override关键字修饰时,父类中Print方法是否被重写?
答:没有被重写。被new 关键字修饰后,Print方法不是重写方法,而是B类中的新方法。
class A
{
public A()
{
Print();
}
public virtual void Print()
{
Console.WriteLine("我是A类");
}
}
class B : A
{
public B()
{
Print();
}
public new void Print()
{
Console.WriteLine("我是B类");
}
}
当将override改为new关键字之后,再次运行得到以下的结果:
这说明了当使用了new关键字之后,只要跟父类有关,运行的Print方法都是运行父类中Print方法。