zoukankan      html  css  js  c++  java
  • 一个有趣的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

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

  • 相关阅读:
    Vue条件判断
    揭秘webpack plugin
    vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多
    npx 是什么?
    PAT 1100 Mars Numbers[难]
    PAT 1075 PAT Judge[比较]
    PAT 1083 List Grades[简单]
    PAT 1082 Read Number in Chinese[难]
    PAT 1135 Is It A Red-Black Tree[难]
    PAT 1127 ZigZagging on a Tree[难]
  • 原文地址:https://www.cnblogs.com/lzhdizhen/p/1023408.html
Copyright © 2011-2022 走看看