gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:02:12 26 4
gpt4 key购买 nike

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

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 方法。

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

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

我希望这是清楚的。谢谢

PS 如果您对此有更好的想法,我会洗耳恭听。

最佳答案

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

Base classes may define and implement virtual methods, and derived classes can override them, which means they provide their own definition and implementation. At run-time, when client code calls the method, the CLR looks up the run-time type of the object, and invokes that override of the virtual method. Thus in your source code you can call a method on a base class, and cause a derived class's version of the method to be executed.

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com