首页 > 解决方案 > 如何实现接受任何参数的接口方法?

问题描述

我有一个 EnemyManager 来处理实现接口的类实例:IEnemy。

public class EnemyManager
{
   public void AddEnemy(IEnemy enemy)
   {
      // Initialize enemy ...
   }
}

public interface IEnemy
{
   void Init<T>(T enemyData);
}

我希望每个实例都使用不同的自定义类型进行初始化:EvilSkeletonData、BossEnemyData ... 等。但我不想为这些数据类型中的每一个创建重载以保持我的界面尽可能干净。

我在想泛型可以工作,但也许它违背了目的,因为我需要显式转换每个 IEnemy 实现的数据:

public class EvilSkeleton : IEnemy
{
   public void Init<T>(T enemyData)
   {
      var enemyData = initParams as EvilSkeletonData;
      if(enemyData != null)
      {
          // Logic here
      } 
   }
}

什么是解决这个问题的干净(如果可能的话)方法?

标签: c#genericsinterface

解决方案


您可以管理通用IEnemy接口以将其与自定义数据(如EvilSkeletonDataBossEnemyData等)一起使用,而不仅仅是通用Init方法。非通用版本可以为任何敌人提供任何通用数据(例如健康)

public interface IEnemy
{
    int Health { get; set; }
}

public interface IEnemy<in T> : IEnemy
{
    void Init(T enemyData);
}

public class EvilSkeletonData
{
}

public class EvilSkeleton : IEnemy<EvilSkeletonData>
{
    public int Health { get; set; }

    public void Init(EvilSkeletonData enemyData)
    {
    }
}

非泛型IEnemy接口还允许您正确地将实例传递给类中的AddEnemy方法EnemyManager,否则您将面临一些强制转换和泛型差异问题。使用示例

var manager = new EnemyManager();

var skeleton = new EvilSkeleton();
skeleton.Init(new EvilSkeletonData());

manager.AddEnemy(skeleton);

推荐阅读