问题描述
Vectorx=newVector();Vectorx在内存中引用vector???x=newvector()实例化个vector放在X里???、但是多态abstractpublicclassShape2{3publicabstractintGetSides();4}5publicclass园:Shape6{7publicoverrideintGetSides()8{9return1;10}11}12publicclass方:Shape13{14publicoverrideintGetSides()15{16return2;17}18}19classProgram20{21staticvoidMain(string[]args)22{23Shapess=new方();为什么不是"方ss=new方()“????????????????????24Console.WriteLine(ss.GetSides());25Shapepp=new园();26Console.WriteLine(pp.GetSides());2728}
解决方案
解决方案二:
第一个问题:Vector()在C#里属于ArrayTypes,ArrayTypes属于ReferenceType。一个ReferenceType分为两个部分,一个有名字的句柄,在你的代码里就是x,一个没有名字的对象实例,就是newVector()。x本身并不是Vector()的实例,它只是指向一个Vector()的实例罢了。分配空间、创建对象实例和指向过程在这里由new完成。表达不行,不知道你明白了吗第二个问题:Shapess=new方();方ss=new方()都是可以的。
解决方案三:
第一个问题你最好将其看作指针.Vectorx=newVector();可以分解为三句话:1Vectorx;2newVector();//此时new出来的变量会被存放到一个未命名的指针下3x=未命名指针;//指向未命名的指针所指向的地址此时x便指向了new出来的变量的地址第二个问题:现在你只有"ss"类和"方"类,自然看不出有什么不一样的.但是如果你现在有了一个"我的方"类:publicclass我的方:Shape此时便可以通过Shape的指针指向"方"或者"我的方"类假如在"Shape"类中写了一个publicvoidDraw(){this.draw();}protectedvoiddraw(){Console.Writeln("Shape");}那么"方"或者"我的方"将会调用Draw()方法.如果你在"方"或者"我的方"中各实现了draw()方法,那么在调用Draw()的时候,它们将进入各自的draw()方法中,这样便实现了多态."方"类中的draw():protectedvoiddraw(){Console.Writeln("方");}"我的方"类中的draw():protectedvoiddraw(){Console.Writeln("我的方");}在两个类中不必重写Draw()这样,在Shape方1=new方();Shape我的方1=new我的方();那么调用方1.Draw();和调用我的方1.Draw();所得的结果分别是"方"和"我的方"