日期:2014-05-18  浏览次数:20909 次

新手求教一个关于new的问题
[code=C#][/code]class Program
  {
  static void Main(string[] args)
  {
  GeometricObject g = new Circle(); //父类型引用指向子类型对象g.draw(); 
  g.draw(); //draw调用的是哪个类的方法?如果g换成Circle类引用呢?
  //如果Circle类不覆盖draw方法,调用的是哪个类的方法? 
  //double d = g.getArea(); // 编译时能否通过。
  Console.ReadKey();
  }
   

  }
  class GeometricObject
  {
  public virtual void draw() { Console.WriteLine("GeometricObject!"); }
  }
  class Ellipse : GeometricObject
  {
  public override void draw() { Console.WriteLine("Ellipse!"); }
  public void getvecter() { }
  }
  class Circle : Ellipse
  {
  public void draw() { Console.WriteLine("Circle!"); }
  public double getArea() { return 1.0; }
  }


  这段代码运行出来为什么回事Ellipse,而不是GeometricObject? new的规则不是看引用的类型吗?

------解决方案--------------------
楼主 去好好看下 继承里面的一些东西应该就能明白了
------解决方案--------------------
你的那几个问题。。调用的都是Circle里的Draw方法,其实你这些问题都可以自己去测试的啊
------解决方案--------------------
是粗心了吧?

class Circle中draw()
是否缺少override ?
------解决方案--------------------
GeometricObject 可以修改为interface试试
结果很明显嘛,子类继承了父类的行为和特征,
那么反过来,要知道父类的行为和特征,是不是可以从每个派生类中找到其父类的行为和特征呢?
GeometricObject g = new Circle(); //父类型引用指向子类型对象g.draw();
其实就是从子类Circle 得到父类的行为的,g.draw() 调用的是父类的方法,
只不过方法被子类重写了,具体实现被子类改变了。
class test:GeometricObject
{
}
GeometricObject g = new test(); g.draw() 就是引用父类的方法了,实现没被test()子类修改,
与父类的行为一致。