C# 如何创建一个接口方法,该方法接受接口的实现作为参数

C# 如何创建一个接口方法,该方法接受接口的实现作为参数,c#,interface,C#,Interface,我正在为一个游戏项目创建一个冲突处理程序接口。我试图让实现的类接受IGameObject的子接口 我尝试过使用IGameObject,它有IEnemy、IPlayer等子接口 interface ICollisionHandler { void HandleCollision(IGameObject object1, IGameObject object2); } class GenericCollision: ICollisionHandler { public void H

我正在为一个游戏项目创建一个冲突处理程序接口。我试图让实现的类接受IGameObject的子接口

我尝试过使用IGameObject,它有IEnemy、IPlayer等子接口

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
更加有用。