我有一个名为List<GameObject>
的{{1}}
我有一个名为MyGameObjects
的类,它继承自DrawableGameObject
。在我的列表中,不仅有GameObject
s,还有GameObject
s。
DrawableGameObject
有一个名为DrawableGameObject
但Animation
没有的属性
我想做以下事情:
GameObject
但它不会让我失望。 如果有办法做到这一点,请帮助我^^
答案 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。