是否可以将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,如果你对此有更好的了解,那么我的所有耳朵都会。
答案 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
个实例,将调用覆盖。