是否可以将派生类添加到其基类列表中,然后从 C# 中的基类列表中调用派生类的方法

本文关键字:列表 基类 派生 方法 调用 然后 添加 是否 | 更新日期: 2023-09-27 18:31:44

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

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
    }
}

所以我要做的是为列表中的每个元素运行更新方法,使用我命名为 power 的元素的表达式,而是运行 Power.Update 方法。

不幸的是,我找到的最接近回答这个问题的帖子在这里,我不完全理解它。

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

我希望这是清楚的。谢谢

PS如果你对此有更好的主意,我全听。

是否可以将派生类添加到其基类列表中,然后从 C# 中的基类列表中调用派生类的方法

使用多态性 - 在基类virtual中标记Update,并将其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实例,将调用覆盖。