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

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的那个元素为例,而是运行Power.Update方法。

不幸的是,我发现与该问题最接近的帖子是here

我希望列表中包含对PowerSystem p的引用,并且希望以某种方式可以将其转换并访问PowerSystem方法。

我希望这很清楚。
谢谢

PS,如果您对此有个更好的主意,我会全力以赴。

最佳答案

使用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实例,将调用替代。

关于c# - 您能否将派生类添加到其基类列表中,然后从C#中的基类列表中调用派生类的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27097027/

10-13 06:55