Как создать метод интерфейса, который принимает реализации интерфейса в качестве параметров - PullRequest
1 голос
/ 16 октября 2019

Я создаю интерфейс обработчика столкновений для игрового проекта. Я пытаюсь заставить реализованный класс принимать подчиненные интерфейсы 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 не реализован. Как я могу решить эту проблему?

1 Ответ

1 голос
/ 16 октября 2019

Вы можете использовать дженерики и делать что-то вроде этого.

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

Это позволяет реализации использовать любой подчиненный интерфейс IGameObject.

Вам рекомендуется использоватьимя лучше, чем T в качестве параметра типа для обобщений, но я недостаточно знаком с тем, что вы делаете, чтобы придумать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...