C# 从基类调用重写的方法

C# 从基类调用重写的方法,c#,inheritance,C#,Inheritance,有没有办法从基类调用重写的方法 class SpaceObject { public draw() {} } class Sun : SpaceObject{ public draw() {} } Sun planet1 = new Sun(); SpaceObject planet2 = new SpaceObject(); SpaceObject planet3 = new SpaceObject(); List<SpaceObject> objs = new Lis

有没有办法从基类调用重写的方法

class SpaceObject {
  public draw() {}
}
class Sun : SpaceObject{
  public draw() {}
}

Sun planet1 = new Sun();
SpaceObject planet2 = new SpaceObject();
SpaceObject planet3 = new SpaceObject();

List<SpaceObject> objs = new List<SpaceObject>();
objs.Add(planet1);
objs.Add(planet2);
objs.Add(planet3);

foreach(SpaceObject o in objs)
  o.draw();
但是我计划对SpaceObject进行多次继承,所以这不是一个好办法。

将SpaceObject.Draw方法设置为虚拟,这样你就可以给太阳一个覆盖绘制方法。有关继承主题的更多信息,请参阅。

以这种方式更改SpaceObject和Sun类

    class SpaceObject
    {
        public virtual void draw()
        {
            Console.WriteLine("Log from parent");
        }
    }

    class Sun : SpaceObject
    {
        public override void draw()
        {
            Console.WriteLine("Log from Child");
        }
    }
您不需要进行if检查和类型转换。就打电话

o.draw();

虚拟关键词?编辑:好,在C++中,你可以使用你的方法声明前面的虚拟关键字来表示你必须在面对聚合的集合时,爬得更高。我知道这是C,但也许是一样的?请尝试为其中的每一个绘制公共虚拟虚空。@Malboroman c也是虚拟的,只是虚拟的。。请确保..@Buksy:SpaceObject将具有虚拟公共无效绘制,Sun将具有公共覆盖无效绘制。这是基本的OOP,您应该停止编码,先读一读,以免每5分钟就卡住一次。@Buksy:您需要使Sun实现覆盖。现在这是最基本的方法。@TheMalboroman别误会我。我说你是对的。。你可以肯定地说,使用虚拟。你抓到我了吗
o.draw();