比较有趣的一个笔试题目
时间:2011-04-15 来源:波拉力司
这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 以便自己以后忘记 - -
相关阅读 更多 +