给大家一道题,娱乐下。顺便散分
- 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类型的引用:
GetType显然是当前实例的类型。
否则所有对象GetType都会返回Object类型了。
[解决办法]
this指代的永远都是实例本身 即使你的引用是testClass类型 但是实例本身任然是testClass1是毋庸置疑的
[解决办法]
这个必须是222,呵呵,顶楼主!!!
[解决办法]
呵呵,订楼主一下
[解决办法]
学习了,高手就是多呀
[解决办法]
我类个去,怎么看不到我自己发的话呀?
[解决办法]
不喜欢做这种题!据我察言观色得出是222.
[解决办法]
不是222, 就是111
if(s != "222")
{
s = "111";
}
[解决办法]
public override string name
{
get
{
return "222";
}
}
得到父类的name是"222",
public void aaa()
{
this.Method();
}
public override void Method()
{
base.Method();
}
得到aaa()调用的是父类的Method()。
this.name被重写了,故为"222".
不知道对不对~!!~!~
[解决办法]
[解决办法]
测试结果为"222"
[解决办法]
再来一个别人做不出来的~
[解决办法]
对this的理解一直都是指向this这四个英文字母所在的类文件的Class……
[解决办法]
[解决办法]
此楼甚好。
[解决办法]
楼主坚持这是this而不是override的作用,敢不敢把override改成new试试看
[解决办法]
怎么获得
[解决办法]
[解决办法]
- C# code
public class testClass{ public virtual string name { get { return "111"; } } public virtual void Method() { Type s = this.GetType(); //大家平时肯定认为这个this的类型是testClass吧。其实呢 }}public class testClass1 : testClass{ }testClass1 c1 = new testClass1(); // 其实呢?其实是你自己坚持要忽略这句话,才这么纠结 c1.Method();
[解决办法]
果然大神哪
[解决办法]
有点明白楼主要说的,一般我们在类里用this都是指本类的,但是Type s = this.GetType(); 的this是testClass1 ,应该是63楼说的原因
[解决办法]
我就说了你非要忽略你自己写的程序。总是在纠结基类。
你做开发只看基类的啊?不看子类,不看声明?那我只能说感到遗憾。
你一直认为this在testClass里面,所以它的类型是testClass
对,没错,你说得对极了。
但是你这么说,那下面这句话就等于是P话。
testClass1 c1 = new testClass1();
------
我觉的你根本就是在玩弄大家。
你的行为就像这个贱人一样:
A:今天我要做糖水,但是我决定不放糖,我放盐。你觉得做出来是什么味道?
B:咸的。
A:但是「糖」水不应该是甜的吗?
B:你放的是盐啊,当然是咸的。
A:但是我做的是糖水啊,它就应该是甜的啊。
B:咸的。
A:糖水是甜的。你先说这句话正确么?你敢说这句话错误么?
B:!@#¥%……&*
[解决办法]
[解决办法]
[解决办法]
[解决办法]
我一进这个帖子内存飙到98%,求高手解释。。
[解决办法]
[解决办法]
[解决办法]
[解决办法]
this指向的就是当前实例 new什么this指向的就是什么~没什么可说的
[解决办法]
[解决办法]
比如你new testClass1那么this就是testClass1,new testClass,this就是testClass
[解决办法]
testClass你根本就没有创建他的对象,只是在子类里面重写了父类的方法,代码是不可能无中生有的。
你的这个程序从头到尾就一个实力那就是testClass1
你的方法本身就不会在编译的时候初始化,他会被放在内存的代码区存放着。
何来的testClass?
这个是单纯的抛开你的理论来讲的。
就算你new了一个testClass,对象的地址又不是一个,肯定也8杆子打不着了
你new testClass1他的this就是testClass1,没有什么可辩解的,虽然代码是在testClass代码区中执行的,不代表是在testClass对象中执行的。
[解决办法]
[解决办法]
[解决办法]
天天喝。。
看会电视。。
你们慢慢研究。。
[解决办法]
加班中.....
[解决办法]
[解决办法]