从父类调用儿童的方法

本文关键字:方法 父类 调用 | 更新日期: 2023-09-27 17:49:27

我有一个List<GameObject>叫做MyGameObjects
我有一个类叫做DrawableGameObject,它继承自GameObject。在我的列表中,不仅有GameObject,还有DrawableGameObject
DrawableGameObject有一个Animation属性,GameObject没有。
我想做以下事情:

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

但是它不让我。如果有办法,请帮助我^^

从父类调用儿童的方法

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

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();

你也可以通过只确定一次强制转换,然后执行一个更快的null检查来优化这一点:

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

注意,然而,这是一个相当明显的违反Liskov替换。你的代码显然是在错误的抽象上运行的。问题中没有足够的信息来对这个问题提出具体的建议,但是如果您需要以这种方式强制转换它们,那么您的类型设计就不正确。

你必须对它进行强制转换。

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

直接转换为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。