C#重写(override)
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⽅法。
writeline函数因此得出的结论是:当⽗类⽅法被⼦类重写之后,只要创建⼦类的实例,当调⽤被重写的⽅法时,最终运⾏的都是⼦类中的⽅法。
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⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论