我如何将通用接口作为方法参数传递?
How could I pass generic interface as a method parameter?
所以我目前正在试验泛型,我刚刚偶然发现了一个令人震惊的问题。我真的对它如何工作有一个抽象的想法,但在搜索答案后我变得更加困惑。
我首先想使用通用构造函数创建 2 个新的 classes,而不是使用它们的函数。一个 class 应该接受第二个 class 作为参数来使用方法 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); //???
}
}
我会建议这种转变:
public interface IDamagable
{
void TakeDamage<T>(T dmg);
}
所以我目前正在试验泛型,我刚刚偶然发现了一个令人震惊的问题。我真的对它如何工作有一个抽象的想法,但在搜索答案后我变得更加困惑。
我首先想使用通用构造函数创建 2 个新的 classes,而不是使用它们的函数。一个 class 应该接受第二个 class 作为参数来使用方法 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); //???
}
}
我会建议这种转变:
public interface IDamagable
{
void TakeDamage<T>(T dmg);
}