如何从包含父对象的列表中调用派生类的方法?

时间:2015-05-03 18:37:16

标签: c#

我正在制作一个拥有库存系统的游戏。库存系统可以包含任何 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多种不同的方法来做同样的事情似乎是错误的。

3 个答案:

答案 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.