C# 如何创建一个接口方法,该方法接受接口的实现作为参数
我正在为一个游戏项目创建一个冲突处理程序接口。我试图让实现的类接受IGameObject的子接口 我尝试过使用IGameObject,它有IEnemy、IPlayer等子接口C# 如何创建一个接口方法,该方法接受接口的实现作为参数,c#,interface,C#,Interface,我正在为一个游戏项目创建一个冲突处理程序接口。我试图让实现的类接受IGameObject的子接口 我尝试过使用IGameObject,它有IEnemy、IPlayer等子接口 interface ICollisionHandler { void HandleCollision(IGameObject object1, IGameObject object2); } class GenericCollision: ICollisionHandler { public void H
interface ICollisionHandler
{
void HandleCollision(IGameObject object1, IGameObject object2);
}
class GenericCollision: ICollisionHandler
{
public void HandleCollision(IGameObject foo, IEnemy bar)
{
bar.TakeDamage();
}
}
GenericCollision应该接受IEnemy,因为它是IGameObject的子接口,但这使它无法实现ICollisionHandler。如何解决这个问题?您可以使用泛型并执行类似的操作
interface ICollisionHandler<T>
where T : IGameObject
{
void HandleCollision(IGameObject object1, T object2);
}
class GenericCollision: ICollisionHandler<IEnemy>
{
public void HandleCollision(IGameObject foo, IEnemy bar)
{
bar.TakeDamage();
}
}
接口ICollisionHandler
其中T:IGameObject
{
无效HandleCollision(IGameObject对象1,T对象2);
}
类GenericCollision:ICollisionHandler
{
公共无效手册汇编(IGameObject foo、IEnemy bar)
{
bar.TakeDamage();
}
}
这允许实现使用IGameObject
的任何子接口
我们鼓励您使用一个比
T
更好的名称作为泛型的类型参数,但我对您所做的工作不太熟悉,因此无法找到一个。这与将接口的第二个参数类型更改为IEnemy完全没有区别。如果这两个功能匹配,我们必须改变其中一个;没有解决办法。@Holger在这个有限的例子中确实是这样,但是OP想要为IPlayer
和IGameObject
的其他子接口实现ICollisionHandler
接口,不仅是IEnemy
。是的,而且没有ICollisionHandler接口。使用模板可以创建多个接口,每种类型一个。你最终会遇到GenericCollision:ICollisionHandler,ICollisionHandler
,这通常不是你所说的generic。这当然是一个值得关注的问题。根据其用法,使接口ICollisionHandler
更加有用。