面试经典考题(五):【面向对象】经典必考题

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实现继承的多态性

继承(四):new方法都与基类中方法无关

本题目考试意图猜测

(1)继承、多态、覆盖重写。(调用顺序等)

 

 

 

转载于:https://www.cnblogs.com/Joetao/articles/2989985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值