您可以将Derived Class添加到其基类列表中,然后从C#中的基类列表中调用Derived类的方法

时间:2014-11-24 02:29:12

标签: c# list inheritance

是否可以将Derived Class添加到其基类列表中,然后从基类列表中调用Derived类的方法(可能通过将其转换回Derived类,因为您知道它最初是Derived类)

public class MySystem
{
    public string name;

    MySystem(string name)
    {
        this.name = name;
    }

    public void Update()
    {
        //dostuff
    }
}

public class PowerSystem : MySystem
{
    public int totalPower;

    PowerSystem (string name, int power) : base(name)
    {
        this.totalPower = power;
    }

    public void Update()
    {
        base.Update();
        //Do other stuff
    }
}

void Main()
{
    List<MySystem> SystemList = new List<MySystem>();

    SystemList.Add(new System("Shields"));
    SystemList.Add(new System("Hull"));

    Power p = new Power("Power", 10);
    SystemList.Add(p);

    foreach(MainSystems ms in SystemList)   
    {
        if(ms.name != "Power")
            ms.Update();
        else
            (PowerSystem)ms.Update();   //This doesn't work
    }

}

所以我要做的就是为列表中的每个元素运行update方法,并使用我命名为power的那个元素的exeption,而不是运行Power.Update方法。

我发现回答这个问题的最近的帖子是here,但遗憾的是我并不完全理解它。

我希望列表中包含对PowerSystem p的引用,并且我可以转换它并访问PowerSystem menthod。

我希望这很清楚。 感谢

PS,如果你对此有更好的了解,那么我的所有耳朵都会。

1 个答案:

答案 0 :(得分:3)

使用polymorphism - 在基类Update中标记virtual,在派生类中标记override

  

基类可以定义和实现虚拟方法,并派生   类可以覆盖它们,这意味着它们提供自己的   定义和实施。在运行时,当客户端代码调用时   方法,CLR查找对象的运行时类型,并调用   覆盖虚方法。因此,在您的源代码中,您可以   在基类上调用一个方法,并导致派生类的版本   要执行的方法。

public class MySystem
{
    public string name;

    MySystem(string name)
    {
        this.name = name;
    }

    public virtual void Update()
    {
        //dostuff
    }
}

public class PowerSystem : MySystem
{
    public int totalPower;

    PowerSystem (string name, int power) : base(name)
    {
        this.totalPower = power;
    }

    public override void Update()
    {
        base.Update();
        //Do other stuff
    }
}

现在,PowerSystem.Update()将自动调用

foreach(MainSystems ms in SystemList)   
{
    ms.Update();
}

对于MySystem个实例,它会调用MySystem.Update,但对于PowerSystem个实例,将调用覆盖。