面试经典考题(五):【面向对象】经典必考题
using System; using System.Collections.Generic; using System.Linq; using System.Text; /* * 多态性:使你能够在类层次结构中多次定义一个方法,这个运行时环境可以调用合适于特定对象的方法版本。 *解决办法:晚绑定,以为着编译器到运行时才选择要执行的方法,为了迫使编译器调用向上类型转换得到的对象的方法的正确版本 *必须使用两个关键字:virtual和override关键字。必须在基类方法中使用virtual关键字,在方法的派生类实现中使用override关键字 */ namespace TestDemo2 { public abstract class A { public A() { Console.WriteLine('A'); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B : A { public B() { Console.WriteLine('B'); } public new void Fun() { Console.WriteLine("B.Fun()"); } public static void Main() { //父类A对象a可以接受派生类B对象(这样可以体现多太) //下面可以写成 //(1)B b=new B();先是实例化B(本来调用B的构造方法,但是B继承自A,所以需要先执行A的构造方法,接着调用B自己的构造方法) //(2)A a=b;体现多态性(向上类型转换) A a = new B(); a.Fun();//这里真正的是B对象Fun,由于使用了new,隐藏了子类的B.Fun而调用基类A.Fun Console.ReadKey(); } } }
结果输出
A
B
A.Fun()
using System; using System.Collections.Generic; using System.Linq; using System.Text; /* * 多态性:使你能够在类层次结构中多次定义一个方法,这个运行时环境可以调用合适于特定对象的方法版本。 *解决办法:晚绑定,以为着编译器到运行时才选择要执行的方法,为了迫使编译器调用向上类型转换得到的对象的方法的正确版本 *必须使用两个关键字:virtual和override关键字。必须在基类方法中使用virtual关键字,在方法的派生类实现中使用override关键字 */ namespace TestDemo2 { public abstract class A { public A() { Console.WriteLine('A'); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B : A { public B() { Console.WriteLine('B'); } public override void Fun() { Console.WriteLine("B.Fun()"); } public static void Main() { //父类A对象a可以接受派生类B对象(这样可以体现多太) //下面可以写成 //(1)B b=new B();先是实例化B(本来调用B的构造方法,但是B继承自A,所以需要先执行A的构造方法,接着调用B自己的构造方法) //(2)A a=b;体现多态性(向上类型转换) A a = new B(); a.Fun();//这里真正的是B对象Fun,由于使用了override,子类需要重写基类 Console.ReadKey(); } } }
输出结果:
A
B
B.Fun()
本题目可以参考自己写文章
继承(五):virtual和override实现继承的多态性
本题目考试意图猜测
(1)继承、多态、覆盖重写。(调用顺序等)