• 一个有趣的C#面试题


    一次面试 做了一道题
    内容如下
    这道题是这样的 有四个类
    public class ClassA
     
    {
            
    public virtual void print()
            
    {
                Console.WriteLine(
    "My ClassA");
            }

     }


    public class ClassB:ClassA
     




    public class ClassC:ClassB
     
    {
            
    public virtual void print()
            
    {
                Console.WriteLine(
    "My ClassC");
            }


     }




    public class ClassD:ClassC
     
    {
             
    public override void print()
            
    {
                Console.WriteLine(
    "My ClassD");
            }

     }


    调用
      ClassC Obj1=new ClassD();
                Obj1.print();

               ClassB Obj2
    =new ClassD();
               Obj2.print();

                ClassA Obj3
    =new ClassD();
                Obj3.print();

    结果
    My ClassD
    My ClassB
    My ClassB

    前两个结果好理解

    但是第三个结果
    ClassA Obj3=new ClassD();
     Obj3.print();
    My ClassB

    为什么会这个样子 ?
    翻了好多资料,
    忽然想起里好几个月前曾经看过一篇文章:
    <<我是谁>> http://allenlooplee.cnblogs.com/archive/2005/11/24/283578.html
    于是找出来 又仔细看了一下  突然感觉自己大约可能理解了
    ClassA Obj3=new ClassD();
    这句代码 是声明一个受ClassA特征约束的ClassD对象 也就是说ClassA对Obj3屏蔽了除ClassA以外的特征(描述的不太准确 )
    而ClassD 继承了类 C->B->A 
    这样 ClassD 本身的Print方法是不会被调用的  C的也不会调用 为什么会调用B的  而不调用A的呢?
    我的理解是 B的方法 重写了A的方法   也就是说 B的Print 能够通过A的特征约束.  而Obj3 是D的对象,  D又继承C, C继承B ,所以, D也具有B的特征! 调用优先级应该是从子类到基类, 也就是说D大于C C大于B B大于A,  而D 和C 都因为没有重写A的方法,肯定通不过 A的特征约束  所以  
    ClassA Obj3=new ClassD();
     Obj3.print();

    必定会输出
     My ClassB

    不过目前 这些都是我自己个人理解   希望高手能指出我的理解错误 和不对的地方

  • 相关阅读:
    闭包
    值类型和引用类型的区别?
    计算机基础知识和基本操作
    Git常用命令
    任务八
    CSS任务七
    CSS任务六
    MySql+EF6,不能选实体框架6.x或者闪退
    以一定的格式生成最新的数据库流水号
    layui父窗体获取弹出窗体元素
  • 原文地址:https://www.cnblogs.com/lzhdizhen/p/1023408.html
Copyright © 2020-2023  润新知