给大家一道题,娱乐下。顺便散分
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类型的引用: