关键字virtual和override。
属于继承当中一个很重要的知识点。
先举个栗子吧。
类:BaseClass
class BaseClass
{
public void Print()
{
Console.WriteLine("this is a base class!");
}
}
类:ChildClass
class ChildClass : BaseClass
{
new public void Print()
{
Console.WriteLine("this is a child class!");
}
}
类:Program
class Program
{
static void Main(string[] args)
{
ChildClass cc = new ChildClass();
BaseClass bc = (BaseClass)cc;
cc.Print();
bc.Print();
Console.ReadKey();
}
}
结果:
可以看出来bc调用的时候出现的结果是基类中的结果。而虚方法和覆写方法就是改变这种情况的,让基类的引用访问升级到子类中,继续代码吧。
类:BaseClass
class BaseClass
{
virtual public void Print()
{
Console.WriteLine("this is a base class!");
}
}
类:ChildClass
class ChildClass : BaseClass
{
override public void Print()
{
Console.WriteLine("this is a child class!");
}
}
类:Program
class Program
{
static void Main(string[] args)
{
ChildClass cc = new ChildClass();
BaseClass bc = (BaseClass)cc;
cc.Print();
bc.Print();
Console.ReadKey();
}
}
结果:
很完美。
关于virtual和override的注意点说一下:
1.覆写和被覆写必须有相同的可访问性,比如说被腹覆写的方法不能使private而覆写的方法确实public
2.不能覆写static或非虚方法
3.方法,属性和索引器,都可以被声明为virtual和override
再单独的说一下override吧。
1.当使用对象基类部分的引用调用一个覆写方法的时候,方法的调用会沿着派生层次上溯执行,一直到标记为override的方法的最高派生类。
2.如果在更高的派生级别有该方法的其他声明,但没有被标记为override,那么它们不会被调用。
举个栗子,eg:
class BaseClass
{
virtual public void Print()
{
Console.WriteLine("this is a base class!");
}
}
class firstChildClass :BaseClass
{
public override void Print()
{
Console.WriteLine("this is first child class!");
}
}
class secondChildClass : firstChildClass
{
public override void Print()
{
Console.WriteLine("this is second child class!");
}
}
类:Program
class Program
{
static void Main(string[] args)
{
secondChildClass scc = new secondChildClass();
BaseClass bc = (BaseClass)scc;
bc.Print();
Console.ReadKey();
}
}
结果如何呢:
但是当secondChildClass 的Print方法声明为new会出现什么情况呢?
你们自己试一下吧,我就不写出来了,enmmmm。