下:
/// <summary>
/// 父类
/// 作者:周公
/// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
/// 日期:2008-09-01
/// </summary>
public class Father
{
public virtual void Run2()
{
Console.WriteLine("Father.Run2");
}
}
/// <summary>
/// 子类
/// 作者:周公
/// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
/// 日期:2008-09-01
/// </summary>
public class Son:Father
{
public void Run2()
{
Console.WriteLine("Son.Run2");
}
}
class Program
{
static void Main(string[] args)
{
Father[] fatherList = new Father[2];
fatherList[0] = new Father();
fatherList[1] = new Son();
fatherList[0].Run2();
fatherList[1].Run2();
}
}
我们看看程序的运行效果:
Father.Run2
Father.Run2
程序运行效果与第一个仍然没有什么区别,不过这次子类(Son)的Run2()方法又出现了与Run方法的第一个版本(Run0())一样的警告:“MethodDemo.Son.Run2()”将隐藏继承的成员“MethodDemo.Father.Run2()”。若要使当前成员重写该实现,请添加关键字override。否则,添加关键字new。
我们再写第四个版本的Run方法,我们称之为Run3(),这次父类中Run3()的修饰符与第三个版本相比没有变化(依然是virtual,虚方法),而子类Son中的Run3()方法与第三个版本相比多了一个override修饰符(这次我们熟悉的那个棕色的波浪线警告没有了)。代码如下:
/// <summary>
/// 父类
/// 作者:周公
/// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
/// 日期:2008-09-01
/// </summary>
public class Father
{
public virtual void Run3()
{
Console.WriteLine("Father.Run3");
}
}
/// <summary>
/// 子类
/// 作者:周公
/// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
/// 日期:2008-09-01
/// </summary>
public class Son:Father
{
public override void Run3()
{
Console.WriteLine("Son.Run3");
}
}
class Program
{
static void Main(string[] args)
{
Father[] fatherList = new Father[2];
fatherList[0] = new Father();
fatherList[1] = new Son();
fatherList[0].Run3();
fatherList[1].Run3();
}
}
把new、virtual、override说透(4)
时间:2011-02-07 csdn博客 周公
程序的运行结果如下:
Father.Run3
Son.Run3
这次我们发现程序的运行结果与前面三次不一样了,这次尽管我们声明的对象类型都是Father类(Father数组装的自然都是Father类型的引用),但是因为实例化数组中第二个元素的时候调用了Son类的构造函数,也就是实例化了一个Father类的子类(我们知道子类可以当作父类来看待,他们之间是is a的关系,反之则不行),也就是说fatherList数组中的第二个元素的引用类型是Father类型,但它的实例类型确实Son类型。而在运行的时候,并不是根据我们的引用类型(引用类型是Father类型的)去调用该引用类 |