我正在制作一个拥有库存系统的游戏。库存系统可以包含任何 WorldObject 。 WorldObject 中有许多派生类将保留在清单中。
public class WorldObject
{
public virtual void SomeMethod();
}
public class Weapon : WorldObject
{
public override void SomeMethod();
}
public class Tool: WorldObject
{
public override void SomeMethod();
}
和库存:
public class Inventory
{
public List<WorldObject> ObjectList;
public Inventory()
{
ObjectList = new List<WorldObject>();
}
public void AddToInventory(WorldObject object)
{
ObjectList.Add(object);
}
public void Foo(int itemIndex)
{
Weapon weaponObject = ObjectList[itemIndex] as Weapon;
if(weaponObject != null)
{
weaponObject.SomeMethod();
}
else
{
Tool toolObject = ObjectList[itemIndex] as Tool;
if(toolObject != null)
{
toolObject.SomeMethod();
}
}
}
}
那么,有没有更好的方法在我的每个项目上调用子方法?随着我的游戏变得越来越大,这看起来很麻烦。有10多种不同的方法来做同样的事情似乎是错误的。
答案 0 :(得分:1)
嗯,这就是为什么SomeMethod
是虚拟的,你知道吗?简单地说:
WorldObject obj = ObjectList[itemIndex];
obj.SomeMethod();
会做你想做的事 - 在正确的祖先中调用SomeMethod
的覆盖。
例如,你可以在维基百科上read the basics。
答案 1 :(得分:0)
以这种方式调用此方法就足够了:
ObjectList[itemIndex].SomeMethod();
并将您的WorldObject类更正为
public class WorldObject
{
public virtual void SomeMethod() {}
}
或
public abstract class WorldObject
{
public abstract void SomeMethod();
}
答案 2 :(得分:0)
由于SomeMethod
是虚拟的,只需在ObjectList[itemIndex]
上获得的对象上调用它即可。如果对象只是WorldObject
,C#将调用base(no-op)方法,如果对象是派生类之一,则调用适当的覆盖方法。 Read about polymorphism on MSDN.