[英]How can I implement an interface method that accepts any parameters?
I have a EnemyManager that handles class instances that implement an interface: IEnemy.我有一个 EnemyManager 来处理实现接口的类实例:IEnemy。
public class EnemyManager
{
public void AddEnemy(IEnemy enemy)
{
// Initialize enemy ...
}
}
public interface IEnemy
{
void Init<T>(T enemyData);
}
I want every instance to be initialized with a different custom type: EvilSkeletonData, BossEnemyData ... etc. But I do not want to create an overload for each of those datatypes to maintain my interface as clean as possible.我希望每个实例都使用不同的自定义类型进行初始化:EvilSkeletonData、BossEnemyData ...等。但我不想为这些数据类型中的每一个创建重载以尽可能保持我的界面干净。
I was thinking that Generics could work but perhaps it defeats the purpose as I would need to explicitly convert the data on each IEnemy implementation:我认为泛型可以工作,但也许它违背了目的,因为我需要显式转换每个 IEnemy 实现上的数据:
public class EvilSkeleton : IEnemy
{
public void Init<T>(T enemyData)
{
var enemyData = initParams as EvilSkeletonData;
if(enemyData != null)
{
// Logic here
}
}
}
What would be a clean (and if possible efficient) way to solve this?什么是解决这个问题的干净(如果可能的话)的方法?
You can manage a generic IEnemy
interface to use it with custom data (like EvilSkeletonData
, BossEnemyData
, etc), instead of having just a generic Init
method.您可以管理通用IEnemy
接口以将其与自定义数据(如EvilSkeletonData
、 BossEnemyData
等)一起使用,而不仅仅是通用Init
方法。 And non-generic version to have any common data for any enemy (like health for example)和非通用版本具有任何敌人的任何通用数据(例如健康)
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)
{
}
}
Non-generic IEnemy
interface also allows you to correctly pass the instance to AddEnemy
method in EnemyManager
class, otherwise you'll face with some casting and generic variance issues.非通用IEnemy
接口还允许您正确地将实例传递给EnemyManager
类中的AddEnemy
方法,否则您将面临一些转换和通用差异问题。 Example of the usage用法示例
var manager = new EnemyManager();
var skeleton = new EvilSkeleton();
skeleton.Init(new EvilSkeletonData());
manager.AddEnemy(skeleton);
To clarify, I was talking about this in comments (if I understand you correctly):为了澄清起见,我在评论中谈到了这一点(如果我理解正确的话):
public interface IEnemy
{
void Init(object enemyData);
}
public interface IEnemy<T> : IEnemy
{
void Init(T enemyData);
}
public class EvilSkeleton : IEnemy<EvilSkeletonData>
{
public void Init(EvilSkeletonData enemyData)
{
// Logic here
}
void IEnemy.Init(object enemyData) => Init((EvilSkeletonData)enemyData);
}
public class EnemyManager
{
public void AddEnemy(IEnemy enemy)
{
// Initialize enemy ...
enemy.Init(new EvilSkeletonData());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.