比较有趣的一个笔试题目

这2天忙于找工作,看.NET笔试题目的时,发现有些笔试题目还是比较有趣的,虽然考的都是基础,但是稍有不慎还是会进入圈套。以下面一个题目为例,听说是晕倒了一群人 - -

 

    class Program
    {
        
static void Main(string[] args)
        {
            B b 
= new B();

            A a 
= new A();

            a.Fun2(b);

            b.Fun2(a);

            Console.Read();
        }
    }

    
public class A
    {

        
public virtual void Fun1(int i)
        {
            Console.WriteLine(i);
        }
        
public void Fun2(A a)
        {
            a.Fun1(
1);
            Fun1(
5);
        }

    }
    
public class B : A
    {

        
public override void Fun1(int i)
        {

            
base.Fun1(i + 1);
        }
    }

问题是给出输出结果。这个题目见过的人觉得很简单,不过对于我这个菜鸟来说,刚开始确实还遇到点麻烦,没整清楚。

后来仔细想了下,觉得这个题目还是蛮绕,蛮有趣的。以下是我对这个题目的浅显理解。

a.Fun2(b);
传入的是B的实例,进入Fun2(A a)方法

  public void Fun2(A a)
        {
            a.Fun1(
1);
            Fun1(
5);
        }

这里不能被参数a所迷惑,以为它就是简单的A的类型,应该根据实际传入的类型去考虑(我觉得这也是解决这个题目的关键吧)。

所以在调用 a.Fun1(1)的时候应该是对应子类B类重写的Fun1(1)方法。故此处输出为2.而接下来Fun1(5)仍然是A的Fun1的方法。故输出是5.

同理,对于b.Fun2(a),传入的参数是A的实例,故调用 a.Fun1(1)应该是父类A的Fun1(1)方法。故此处输出为1,而接下来Fun1(5)却是B的Fun1的方法。故输出是6.

 

做个mark 以便自己以后忘记 - -



 

posted @ 2011-04-15 16:12  波拉力司  阅读(483)  评论(1编辑  收藏  举报