简体   繁体   English

如何实现接受任何参数的接口方法?

[英]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接口以将其与自定义数据(如EvilSkeletonDataBossEnemyData等)一起使用,而不仅仅是通用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.

相关问题 如何创建一个接受类和接口作为参数的扩展方法 - How to create an Extension Method that accepts a class and an interface as a parameters 仅接受实现特定接口的类的方法 - Method that accepts only classes that implement a specific interface 如何实现方法 <T> (T)来自界面 - How can I implement method<T>(T) from an interface Blazor,如何在输入标签上触发“输入键事件”以调用接受字符串参数的方法 - Blazor, how can I trigger an "enter key event" on an input tag to call method that accepts string parameters 如何编写一个接受lambda表达式的方法,其中lambda表达式的参数数量未知? - How can I write a method that accepts a lambda expression where the number of parameters to the lambda expression is unknown? 如何创建一个接受多个lambda表达式作为参数的方法? - How do I make a method that accepts multiple lambda expressions as parameters? 如何将两个相似的具体对象传递给具有在C#中实现泛型的接口参数的方法? - How do I pass two similar concrete objects to a method with interface parameters that implement generics in C#? 如何使用通用方法实现接口? - How can you implement an interface with a generic method? 如何制作一个接受任何类型列表的方法 - How do I make a method that accepts a list of any type 我如何实现接受XmlDocument的RESTful服务 - How can I implement a RESTful service that accepts an XmlDocument
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM