给大家一道题,娱乐上。顺便散分
给大家一道题,娱乐下。顺便散分
------解决方案--------------------
222,没测试,猜测的,不过我的直觉应该不会错。
------解决方案--------------------
你也很聪明的认为1L是这么认为的,呵呵
------解决方案--------------------
不是啦,因为你使用的时候定义的是testClass1,如果这样写:
testClass c1 = new testClass1();
c1.aaa();
那样才有可能会理解为111
------解决方案--------------------
友情路过。
------解决方案--------------------
不懂 帮顶
------解决方案--------------------
当然,我说的是有可能,而实际上却不是哦。因为显示接口实现的时候就是这样的,不然就不需要区分出2种接口实现方式了。
------解决方案--------------------
基础有点欠缺了,回去复习下
------解决方案--------------------
请自行搜索“接口的显示实现和隐示实现”
显示实现就是将类型强制转换到接口类型才能调用的实现,虽然定义的是继承类,但是使用的时候要作为其接口才能访问其方法,通常情况下是不可见的。
而你这里都定义的是public,因此怎么都是透明的了,直接被改写为了222返回。
------解决方案--------------------
很简单的问题。
其实如果把get/set看作方法。似乎这个问题就容易理解很多。实际上get/set也的确就是方法。
------解决方案--------------------
应该是111吧,目测80%以上
------解决方案--------------------
都override了,get出来的很明显了。。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
GetType显然是当前实例的类型。
否则所有对象GetType都会返回Object类型了。
------解决方案--------------------
------解决方案--------------------
get也就是个get方法 .net执行方法调用的时候会去元数据里面查这个方法的IL代码然后编译 这边重写了get方法所以方法指针指向的是子类的get方法
------解决方案--------------------
因为new对象的时候一个对象的内存模型包含3个东西 一块儿指向该对象type类的指针(gettype方法用) 一块儿同步索引(lock语句用)还有一块儿是自身代码 你在new testClass1的时候指向type类的指针实际指向的就是一个testClass1的type类 这个过程是在你调用构造函数的时候就确定了的 所以说虽然实例化的时候你所用的是一个testClass类型的引用:
- 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出来的很明显了。。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
GetType显然是当前实例的类型。
否则所有对象GetType都会返回Object类型了。
------解决方案--------------------
------解决方案--------------------
get也就是个get方法 .net执行方法调用的时候会去元数据里面查这个方法的IL代码然后编译 这边重写了get方法所以方法指针指向的是子类的get方法
------解决方案--------------------
因为new对象的时候一个对象的内存模型包含3个东西 一块儿指向该对象type类的指针(gettype方法用) 一块儿同步索引(lock语句用)还有一块儿是自身代码 你在new testClass1的时候指向type类的指针实际指向的就是一个testClass1的type类 这个过程是在你调用构造函数的时候就确定了的 所以说虽然实例化的时候你所用的是一个testClass类型的引用: