首页 新闻 会员 周边

C#类型转换的问题

1
悬赏园豆:20 [已解决问题] 解决于 2011-12-15 08:55
class Fax
{
public void FaxDoSome()
{
Console.WriteLine("Fax's public Method");
}
protected void SelfDo()
{
Console.WriteLine("Fax's protected Method");
}
}
class LaserPrinter : Fax
{
public void LaserPrinterDoSome()
{
Console.WriteLine("LaserPrinter's public Method");
}
private static void Do()
{
Console.WriteLine("laserPrinter's private Method");
}
}
class Program
{
private static T Min<T>(T o, T b)where T:class,IComparable<T>
{
if (o.CompareTo(b) < 0) return o;
return b;
}
static void Main()
{
Fax f = new LaserPrinter();
f.FaxDoSome();//只能调用Fax的一个方法
Console.WriteLine(f.GetType());//LaserPrinter 既然是LaserPrinter,那为什么不能调用LaserPrinter的方法呢?
Console.WriteLine(f is Fax);//true
Console.WriteLine(f is LaserPrinter);//true f到底是什么类型。。怎么都是true?
Console.WriteLine(f is Object);//到这里我就有点明白为什么是true了。但是f.GetType()得到的为什么是LaserPrinter呢?
//里氏替换原则!该怎么理解?哪位大牛能指点指点,帮助大家共同进步!
Console.ReadKey();
}

}

问题详情见:http://www.cnblogs.com/smailxiaobai/archive/2011/12/14/2287330.html

c#
Rookier的主页 Rookier | 小虾三级 | 园豆:652
提问于:2011-12-14 16:40
< >
分享
最佳答案
0

你去读下《CLR via C#》吧。前几章就在回答你这个问题。这么点地方根本不够解释清楚的。

收获园豆:20
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-12-14 17:20

is操作符检查一个对象是否兼容于指定的类型。

new操作符做的事:

1.计算类型及其所有基类型中定义的所有实例字段需要的字节数。

2.从托管堆中分配指定类型要求的字节数,分配内存,分配所有字节都设为0.

3.初始化对象的类型对象指针和同步块索引成员。

4.调用类型的实例构造器。向其传入在对new调用中指定的任何实参。

new执行了所有这些操作后会返回指向新建对象一个引用,在上面的代码中,这个引用会被保存在f中

就是说 虽然生命的是Fax f=new LaserPrinter(); 但是f的指针还是指向LaserPriter类型的吗?

是这样解释这个问题的吗?

Rookier | 园豆:652 (小虾三级) | 2011-12-14 17:40

这个问题是不是也有里氏替换的原理?该怎么理解呢。。。大哥,帮帮忙。。弄不清楚感觉忒闹心。。你说的这本书我现在就在看着,找了。。就找到上面那段话,是上面的原因吗?

Rookier | 园豆:652 (小虾三级) | 2011-12-14 17:43

@小小白白: 你说的都是对的。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-12-14 17:43

@水牛刀刀: 

但是:

 f.FaxDoSome();//只能调用Fax的一个方法 
Console.WriteLine(f.GetType());//LaserPrinter 既然是LaserPrinter,那为什么不能调用LaserPrinter的方法呢?
Rookier | 园豆:652 (小虾三级) | 2011-12-14 17:56

@小小白白: 因为它查找的是f这个变量的类型(Fax)的方法表,并且这个方法是非虚的。就在书中你刚刚那段话引用的下面,讲的很清楚了。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-12-14 18:15
其他回答(1)
-1
f.GetType()得到的为什么是LaserPrinter呢? 

  Fax f = new LaserPrinter();       
你说不是
LaserPrinter 是什么呢?

chenping2008 | 园豆:9836 (大侠五级) | 2011-12-14 16:54

Fax f

支持(0) 反对(0) Rookier | 园豆:652 (小虾三级) | 2011-12-14 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册