class program
{
public static void Main(string[] args)
{ Person p1 = new 中国人();
中国人 p2 = (中国人)p1;
Console.WriteLine(p2.j);
Console.ReadKey();
}
}
class Person
{
public int i = 4;
}
class 中国人 : Person
{
public int j = 8;
}
上述代码,p1指向了托管堆中“new中国人”的Person部分,这句话,应该没错吧!!!那(中国人)p1就是把p1强制转换成中国人,既然p1都没有中国人的特有内容,只具有Person的内容,怎么能把p1转换成中国人呢?不懂?
{
public static void Main(string[] args)
{ Person p1 = new 中国人();
中国人 p2 = (中国人)p1;
Console.WriteLine(p2.j);
Console.ReadKey();
}
}
class Person
{
public int i = 4;
}
class 中国人 : Person
{
public int j = 8;
}
上述代码,p1指向了托管堆中“new中国人”的Person部分,这句话,应该没错吧!!!那(中国人)p1就是把p1强制转换成中国人,既然p1都没有中国人的特有内容,只具有Person的内容,怎么能把p1转换成中国人呢?不懂?
解决方案 »
- windows socket error;由于连接方在一段时间后没有正确答复
- C# 一个难题,求高手帮忙?(急)
- 问一个关于正则的问题,图片替换的问题.
- SqlConnection的作用我是这样理解的,大家看对不对
- 关于简单正则!80分诚心求教!!
- TreeView控件与数据库问题
- C#中使用 OleDb 访问 ACCESS 数据库能读但不能写
- 各位大虾求教,我在服务端发送一条信息后,客户端用多线程去接受,并且去new一个窗口出来,但是,窗口老是不能正常显示,是怎么回事情啊
- 我想自己做一个模拟session功能的dll,怎么实现??
- 建立一个线程通过该线程创建了50个线程来扫描局域网内的机器?????
- 我用SoundPlayer类在WinForm里播放背景音乐,可是程序运行没多久它就自动退出去了
- 求助,C#正则匹配
class 中国人 : Person
Person包含类,中国人相当一个派生类,嵌套了;
什么叫做“Person部分”?这个十有八九是错的。如果一定要附会一些c术语可以这样说:“new 中国人”实例化了一个对象,p1指向这个对象。这个对象有个指针指向“中国人”类型对象。而这个中国人类型对象,它内部又有一个所继承的类型列表,其中第一项指向“Person”类型对象。
所以引用类型子类和父类间互相转换,不需要大量运算,效率是很高的。这根装箱拆箱不同。
比如TextBox等转换为Control类,这时换了块牌子,告诉编译器我是Control类,Text属性暂时被隐蔽了,转换回TextBox,又把牌子换了回来,这时Text属性又能用了。以上是个人猜测,仅供参考。
可以看到实际还是“中国人”。
//因为B是A的一个子类,父类可以指向(引用)子类对象
就不难理解,但是你不能说中国人就具有了人的所有特征,比如说中国人没有美国人黄色的头发和蓝色的眼睛(打比方美国人就这样吧,其中美国人也继承了人这个类) 理解了这个,那这句 中国人 p2 = (中国人)p1;
也就不难理解,作为派生类的一个实例p2要想具备p1的所有信息,必需得用到强制转化把人类的对象p2转化成中国人的实例!这样说,你应该明白吧?
这是不对的。运行时p1不但可能实例化为中国人,也可能实例化为国产女优。Person不可能在编译时就具有了将来一切的、“万能的”具体人类(子类)的所有特性。所以这个是不对的。多态不是这个意思。
{
public int 齿龄;
}class 香蕉
{
public int 成熟度; public static implicit operator 马(香蕉 x)
{
return new 马 { 齿龄 = x.成熟度 / 5 };
}
}在这个例子里,我无厘头地定一个把香蕉对象可以强制类型转换为马对象的例子。使用它的代码就是var a = new 香蕉 { 成熟度 = 90 };
var b = (马)a;运行它你就会发现变量b引用了一个齿龄为18的马对象。但是如果你打印a和b的GetHashCode(),它们总是不相同的。可见,虽然我们声明不同变量时类型不同,于是编译器会帮我们检查代码中的各种类型不匹配的代码,但是它执行的结果,有时候(我猜大多数几乎所有用法都仅仅是这种)是让不同变量指向相同的对象,可是有时候它是让系统调用自定义的类型转换方法(而这很可能就是为了产生与香蕉完全无关的新的马)。
表演班 team;
....
list.AddRange(team); //把team中的所有成员加入演员表这个代码很可能编译不过去。可是你不需要修改这个代码,只要为表演班类型增加一个自定义的转换为List<演员>的方法,上述代码就编译过去了。可见你的代码表现力就丰富了,代码成文自明。再比如代码var clause = (主语)s1 + (谓语)s2 + (宾语)s3;这个代码表示三个字符串被转换为三类不同的语言元素,然后被两个自定义重载的+运算符操作,从而产生了“句子”这个新对象。这样的代码是不是成文自明?这就需要自定义类型转换和自定义运算符重载技术,才能写出能被用户一目了然的代码(而不是那种只有程序员才习惯看的代码)。