从父类调用儿童的方法
本文关键字:方法 父类 调用 | 更新日期: 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。