【问题标题】:How could I pass generic interface as a method parameter?如何将泛型接口作为方法参数传递?
【发布时间】:2020-11-01 17:24:16
【问题描述】:

所以我目前正在尝试使用泛型,但我偶然发现了一个令人震惊的问题。我确实对它的工作原理有一个抽象的想法,但是在搜索了答案之后,我变得更加困惑。

我首先想使用泛型构造函数创建 2 个新类,而不是使用它们的函数。一个类应该接受第二个类作为参数来使用方法 Attack() 和动态(class2.health - class1.damage),但它必须实现一个 IDamagable 接口。

我可能会犯奇怪的错误。对不起。

public class GenericsIdeas : MonoBehaviour
{

public interface IDamagable<T>
{
    void TakeDamage(T dmg);
}

public class Enemy<T1, T2> : IDamagable<T1>
{
    T1 damage;
    T2 health;

    public void Attack(IDamagable d)
    {
        d.TakeDamage((dynamic)damage);
    }

    public void TakeDamage(T1 damage)
    {
        dynamic dmg = (dynamic)damage;
        dynamic hp = (dynamic)health;
        health -= dmg;
        Debug.Log("Enemy health: " + health);
    }

    public Enemy(T1 t1, T2 t2)
    {
        damage = t1;
        health = t2;
    }
}

public class Player<T1, T2> : IDamagable<T1>
{
    T1 damage;
    T2 health;

    public void Attack(IDamagable d)
    {
        d.TakeDamage((dynamic)damage);
    }

    public void TakeDamage(T1 damage)
    {
        dynamic dmg = (dynamic)damage;
        dynamic hp = (dynamic)health;
         health -= dmg;
        Debug.Log("Player health: " + health);
    }

    public Player(T1 t1, T2 t2)
    {
        damage = t1;
        health = t2;
    }
}

void Start()
{
    Player<int, int> player = new Player<int, int>(6, 10);
    Enemy<float, float> enemy = new Enemy<float, float>(4.32f, 20.61f);
    player.Attack(enemy.IDamagable); //???
}
}

【问题讨论】:

    标签: c# class generics interface


    【解决方案1】:

    我会建议这种转变:

    public interface IDamagable
    {
        void TakeDamage<T>(T dmg);
    }
    

    【讨论】:

    • 谢谢,但仍然......我怎样才能让这部分“player.Attack(enemy.IDamagable)”发生?
    • 我不明白这对我有什么帮助
    • 好吧,对不起。看你的回答我搞砸了,哈哈。谢谢你的帮助!很棒的作品!
    • 很高兴为您提供帮助。我认为这是不言自明的。很抱歉让您难以理解。
    • 是的,对不起,我只是有点累了,但我想我无论如何也不会想到这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多