从父母那里召唤儿童方法

时间:2015-05-16 14:05:35

标签: c# list oop inheritance types

我有一个名为List<GameObject>的{​​{1}} 我有一个名为MyGameObjects的类,它继承自DrawableGameObject。在我的列表中,不仅有GameObject s,还有GameObject s。
DrawableGameObject有一个名为DrawableGameObjectAnimation没有的属性 我想做以下事情:

GameObject

但它不会让我失望。 如果有办法做到这一点,请帮助我^^

3 个答案:

答案 0 :(得分:3)

您可以强制转换对象并访问其成员。像这样:

foreach (var gameObject in gameObjects)
    if (gameObject is DrawableGameObject)
        (gameObject as DrawableGameObject).Animation();

或者,更接近你的表现:

for (int i = 0; i < gameObjects.Count; i++)
    if (gameObjects[i].GetType() == typeof(DrawableGameObject))
        ((DrawableGameObject)gameObjects[i]).Animation();

您还可以通过仅确定一次强制转换然后执行更快的空检查来优化这一点:

foreach (var gameObject in gameObjects)
{
    var obj = gameObject as DrawableGameObject;
    if (obj != null)
        obj.Animation();
}

但请注意,这是对Liskov Substitution的明显违反。您的代码显然是在错误的抽象上运行。问题中没有足够的信息可以就此问题提出具体建议,但如果您需要以这种方式投射,那么您的类型设计不正确。

答案 1 :(得分:1)

你必须施展它。

for (int i = 0; i < MyGameObjects.Count; ++i) {
    if (MyGameObjects[i].GetType() == typeof(DrawableGameObject)) {
        ((DrawableGameObject)MyGameObjects[i]).Animation;
    }
}

答案 2 :(得分:0)

只需将其投放到DrawableGameObject

for( int i = 0; i < MyGameObjects.Count; i++ )
    if( MyGameObjects[i] is DrawableGameObject )
    {
        var drawable = (DrawableGameObject)MyGameObjects[i];
        ...
    }

或者,为了更有效率:

for( int i = 0; i < MyGameObjects.Count; i++ )
{
    var drawable = MyGameObjects[i] as DrawableGameObject;
    if( drawable != null )
        ...
}

如果演员表无效,as运算符将返回null。