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

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

  • 相关阅读:
    CF(437C)The Child and Toy(馋)
    Android大放送干:书籍、过程、工具等各种全
    UVa 121
    ONOS系统架构演进,实现高可用性解决方案
    PowerDesigner 的常用小技巧 转
    现代团队必须是非常非常有活力、有激情同时又有向心力、有限属技能的团队。
    关于团队管理的心得体会 转
    Delphi 编译错误信息表
    财务基础 入门
    Sql Server CONVERT获取当前日期及日期样式
  • 原文地址:https://www.cnblogs.com/lzhdizhen/p/1023408.html
Copyright © 2011-2022 走看看