首页 新闻 会员 周边 捐助

前两天面试的一个题目

0
悬赏园豆:15 [待解决问题] 解决于 2011-04-17 11:43

题目如下,请问程序输出是什么?并解释

class Program
    {
        static void Main(string[] args)
        {
            TestA((A)new B());
            TestB((B)new B());

            Console.Read();
        }

        static void TestA(A a)
        {
            a.Method1("100"); 
            a.Method2(); 
            a.Method3(); 
        }

        static void TestB(B b)
        {
            b.Method1(100); 
            b.Method2(); 
            b.Method3(); 
        }

    }

    class A
    {
        public virtual void Method1(object obj)
        {
            Console.WriteLine("A Do Object");
        }

        public virtual void Method2()
        {
            Console.WriteLine("A Do 2");
        }

        public virtual void Method3()
        {
            Console.WriteLine("A Do 3");
        }
    }


    class B : A
    {
        public void Method1(string str)
        {
            Console.WriteLine("B Do String");
        }

        public override void Method2()
        {
            Console.WriteLine("B Do 2");
        }

        public new void Method3()
        {
            Console.WriteLine("B Do 3");
        }
    }

问题补充: B Do 2 A Do 3 B Do 2 B Do 3 都好解释,关键是A Do Object 和A Do Object这两个结果 A.Method1("100"),应该是检查A类中有无该方法 B.Method1(100),应该是先检查B中有无整型参数的函数,没有的话会检查父类中有无该类型参数的函数
xiaolun的主页 xiaolun | 初学一级 | 园豆:70
提问于:2011-04-02 11:43
< >
分享
所有回答(5)
0

A Do Object ;A Do 2;A Do 3    //这三个是Object 类型的

A Do Object ;A Do 2;A Do 3    //这三个是String类型的

wlz0815 | 园豆:587 (小虾三级) | 2011-04-02 11:54
sorry,写错测试方法了应该是testA和testB
支持(0) 反对(0) xiaolun | 园豆:70 (初学一级) | 2011-04-02 11:59
TestA((A)new B());
TestB((B)new B());
这种情况的结果是
A Do Object
B Do 2
A Do 3
支持(0) 反对(0) xiaolun | 园豆:70 (初学一级) | 2011-04-02 12:05
0

virtual才能在继承类中override吧。否则同名的函数会被继承类覆盖的。要想不覆盖,需要在继承类的方法添加new关键字。

Virus-BeautyCode | 园豆:1619 (小虾三级) | 2011-04-02 12:16
程序没有问题,求每个输出的解释
支持(0) 反对(0) xiaolun | 园豆:70 (初学一级) | 2011-04-02 12:21
0

virtual,override,new你首先应该了解这几个关键字的用法。

virtual  同意背重载。

override 同意父类重载,也同意子类重载。

new 跟子类无关。

奋斗张 | 园豆:514 (小虾三级) | 2011-04-02 13:03
0

这个主要涉及到调用虚方法的情况:

 

1 TestA((A)new B());

 

1 static void TestA(A a)
2 {
3 a.Method1("100");
4 a.Method2();
5 a.Method3();
6 }

TestA调用时参数是(A)new B(),然后是调用A类的三个虚方法。调用虚方法时会检查发出调用的那个对象(就是new B())的方法表,如果找不到,就一直回溯到Object类。

 

而B类中只有方法二是对A类虚方法的重写。所以就会:

  1. 调用A类的Method1  A Do Object
  2. 调用B类的Method2  B Do 2
  3. 调用A类的Method3    A Do 3
清香白莲素还真 | 园豆:205 (菜鸟二级) | 2011-04-02 13:07
A Do Object
B Do 2
A Do 3

A Do Object
B Do 2
B Do 3

因为B是继续A的。
支持(0) 反对(0) wlz0815 | 园豆:587 (小虾三级) | 2011-04-02 14:34
0

看看!

阿 & 文 | 园豆:195 (初学一级) | 2011-04-04 12:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册