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
你去读下《CLR via C#》吧。前几章就在回答你这个问题。这么点地方根本不够解释清楚的。
is操作符检查一个对象是否兼容于指定的类型。
new操作符做的事:
1.计算类型及其所有基类型中定义的所有实例字段需要的字节数。
2.从托管堆中分配指定类型要求的字节数,分配内存,分配所有字节都设为0.
3.初始化对象的类型对象指针和同步块索引成员。
4.调用类型的实例构造器。向其传入在对new调用中指定的任何实参。
new执行了所有这些操作后会返回指向新建对象一个引用,在上面的代码中,这个引用会被保存在f中。
就是说 虽然生命的是Fax f=new LaserPrinter(); 但是f的指针还是指向LaserPriter类型的吗?
是这样解释这个问题的吗?
这个问题是不是也有里氏替换的原理?该怎么理解呢。。。大哥,帮帮忙。。弄不清楚感觉忒闹心。。你说的这本书我现在就在看着,找了。。就找到上面那段话,是上面的原因吗?
@小小白白: 你说的都是对的。
@水牛刀刀:
但是:
f.FaxDoSome();//只能调用Fax的一个方法
Console.WriteLine(f.GetType());//LaserPrinter 既然是LaserPrinter,那为什么不能调用LaserPrinter的方法呢?
@小小白白: 因为它查找的是f这个变量的类型(Fax)的方法表,并且这个方法是非虚的。就在书中你刚刚那段话引用的下面,讲的很清楚了。
f.GetType()得到的为什么是LaserPrinter呢?
Fax f = new LaserPrinter();
你说不是
LaserPrinter 是什么呢?
Fax f