c# - 如何实现接受任何参数的接口方法?
问题描述
我有一个 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
}
}
}
什么是解决这个问题的干净(如果可能的话)方法?
解决方案
您可以管理通用IEnemy
接口以将其与自定义数据(如EvilSkeletonData
、BossEnemyData
等)一起使用,而不仅仅是通用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);
推荐阅读
- apache - 如何识别我的 csv 文件中导致我的批量加载映射减少作业在 apache phoenix 中失败的行
- angular - 使用引导程序或角度材料的自定义媒体查询
- mongodb - 如何根据链接的文档字段对字段进行更新
- python-3.x - 如何计算 tensorflow_probability 输出的分位数和方差?
- javascript - 使用 mongoose 根据 mongodb 中的录取日期计算文件
- c# - 无法为 docusign 中的模板 ID 创建的信封创建发件人视图
- c++ - unique_ptr 和 make_unique 的异常
- android - 从另一个没有风味的模块获取当前模块风味名称
- sql - 如何在不使用经典方式或不使用 where 子句的情况下解决父子脚本
- dropwizard - 如何禁用默认异常映射器?