请各位高手指导一下,本人做一道练习题遇到问题,代码如下:
using System;
class MyBase
{
int myInt=10;
virtual public void int MyInt
{
get{return myInt;}
}
}
class MyDerived:MyBase
{
int myInt=20;
}
class Program
{
static void Main()
{
var myT=new MyDerived();
MyBase mybc=(MyBase)myT;
Console.WriteLine(myT.MyInt);
Console.WriteLine(mybc.MyInt);
}
}
谁能告诉我 Console.WriteLine(myT.MyInt); 这条语句的输出结果是什么,为什么?
virtual 不是要被复写才能执行的,只要继承了,子类都可以执行父类可见的方法和属性,只是说复写了,就执行复写的,父类的就不执行了
都是输出 10
我知道会执行virtual属性,不然我也不会子类没有申明该属性,却在调用。问题是从父类继承了该属性后为什么没有输出子类的字段myInt=20,而是输出父类的字段。说具体点,为什么,这里面是什么机制原理主导的。
@书生soft: myInt 是私有变量,不被子类继承
@Yu: 你说得不对,私有变量也会被继承,只不过子类无权访问罢了,所以private字段似乎跟子类没啥关系。
@书生soft: 继承本来意义就是要对基类可以进行重用,扩展和修改,如果对那些私有的不动产,拥有但不能用也算是继承,那也可以。对于输出10,是对同名字段,按离MyInt最近创建的顺序来访问的
@Yu: 你说得好像很有道理,在哪能找到这块理论知识的书籍,补一补。
@书生soft:介绍两本
你必须知道的.NET和CLR via C#
@Yu: 不知道写得怎么样,我一般都是看老外写的书,写的很深入透彻。国内的书都很浅,写得不地道。不过我只是菜鸟,目前正入门,正在看C#图解教程和C#入门经典第六版
@书生soft: 上面那2本都挺不错了。前本包含各种中间语言,个人喜好后者。
@书生soft: 电子中文版目前有第三版,第四版是英文。怎么说,从头到尾看一遍你对语言理解就更深了
@Yu: 谢谢,分数给你了。
@书生soft: 前者是国内的,后者是译著
对入门来说,较为深入,但又本质的东西
建议先入门,建立一定经验,再消化
对能阅读老外的外籍书籍,当然好事,他们都是比国内快几拍