日期:2014-05-17  浏览次数:20777 次

给大家一道题,娱乐下。顺便散分
C# code

public class testClass
{
    public virtual string name
    {
        get { return "111"; }
    }

    public virtual void Method()
    {
        string s = this.name;    //s是多少  
    }
}

public class testClass1 : testClass
{
    public override string name
    {
        get
        {
            return "222";
        }
    }
    public void aaa()
    {
        this.Method();
    }

    public override void Method()
    {
        base.Method();
    }
}
testClass1 c1 = new testClass1();
        c1.aaa();




------解决方案--------------------
222,没测试,猜测的,不过我的直觉应该不会错。
------解决方案--------------------
你也很聪明的认为1L是这么认为的,呵呵
------解决方案--------------------
不是啦,因为你使用的时候定义的是testClass1,如果这样写:
testClass c1 = new testClass1();
c1.aaa();
那样才有可能会理解为111
------解决方案--------------------
友情路过。
------解决方案--------------------
不懂 帮顶
------解决方案--------------------
当然,我说的是有可能,而实际上却不是哦。因为显示接口实现的时候就是这样的,不然就不需要区分出2种接口实现方式了。
------解决方案--------------------
基础有点欠缺了,回去复习下
------解决方案--------------------
请自行搜索“接口的显示实现和隐示实现”
显示实现就是将类型强制转换到接口类型才能调用的实现,虽然定义的是继承类,但是使用的时候要作为其接口才能访问其方法,通常情况下是不可见的。
而你这里都定义的是public,因此怎么都是透明的了,直接被改写为了222返回。
------解决方案--------------------
很简单的问题。

其实如果把get/set看作方法。似乎这个问题就容易理解很多。实际上get/set也的确就是方法。
------解决方案--------------------
应该是111吧,目测80%以上
------解决方案--------------------
都override了,get出来的很明显了。。
------解决方案--------------------
探讨

都override了,get出来的很明显了。。

------解决方案--------------------
探讨

为什么不是111呢 其实不是override的事
引用:

都override了,get出来的很明显了。。

------解决方案--------------------
探讨

不是啦,因为你使用的时候定义的是testClass1,如果这样写:
testClass c1 = new testClass1();
c1.aaa();
那样才有可能会理解为111

------解决方案--------------------
GetType显然是当前实例的类型。

否则所有对象GetType都会返回Object类型了。
------解决方案--------------------
探讨

其实这个真不管override的事,有关系,但是不是很大
引用:

引用:

都override了,get出来的很明显了。。


我也是觉得这样的

------解决方案--------------------
get也就是个get方法 .net执行方法调用的时候会去元数据里面查这个方法的IL代码然后编译 这边重写了get方法所以方法指针指向的是子类的get方法 
探讨

其实这个真不管override的事,有关系,但是不是很大
引用:

引用:

都override了,get出来的很明显了。。


我也是觉得这样的

------解决方案--------------------
因为new对象的时候一个对象的内存模型包含3个东西 一块儿指向该对象type类的指针(gettype方法用) 一块儿同步索引(lock语句用)还有一块儿是自身代码 你在new testClass1的时候指向type类的指针实际指向的就是一个testClass1的type类 这个过程是在你调用构造函数的时候就确定了的 所以说虽然实例化的时候你所用的是一个testClass类型的引用: