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的规则不是看引用的类型吗?
{
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的规则不是看引用的类型吗?
解决方案 »
- socket通信,为什么会发生接收字节数高达2W多个字节的情况?
- 驗證網址是否存在
- 很迷茫,C#难道只能应用于ASP.NET方面?
- 还是不明白 大家帮帮忙啊
- 为什么这样??
- 在WEBFORM中如何在知道treeview中节点的ID的情况下,而得到这个node对象呢?
- Visual Studio代码编辑区域的提示是用的什么控件做的,跟随光标是怎么实现的?
- 关于递归数据时序号列怎么实现的问题请教!!!!!!!!!!!!!!!!!!
- 怎么没有对象的方法属性提示啊?
- 《300分;高分求解,C/S模式下的安全问题。---被反编译后)》
- Regex.Match█████C#正则表达式使用方法
- C#获得QQ相关信息
g.draw();
Console.ReadKey();
我其实是想问这样子主函数执行下来的结果是 Ellipse,为什么啊、
我看了继承的机制也没怎么明白、还望赐教啊、
是否缺少override ?
我只是想知道为什么像我现在这样写得到的是Ellipse
结果很明显嘛,子类继承了父类的行为和特征,
那么反过来,要知道父类的行为和特征,是不是可以从每个派生类中找到其父类的行为和特征呢?
GeometricObject g = new Circle(); //父类型引用指向子类型对象g.draw();
其实就是从子类Circle 得到父类的行为的,g.draw() 调用的是父类的方法,
只不过方法被子类重写了,具体实现被子类改变了。
class test:GeometricObject
{
}
GeometricObject g = new test(); g.draw() 就是引用父类的方法了,实现没被test()子类修改,
与父类的行为一致。