我有一个名为Powerup
的基类和2个后代类Bomb
和Repel
。
我有一个需要调用的方法,我将对象类型作为参数传递。
public void PowerupExpired<T>() where T : Powerup {
//do stuff here
}
基类Powerup
有什么办法我可以获取子类类型并将其传递给方法吗?我不能使用通用类型。传递给方法的类型必须是Powerup
现在,我正在Powerup
课程中使用:
if (this is BombPowerup)
PowerupManager.PowerupExpired<BombPowerup>();
else if (this is RepelPowerup)
PowerupManager.PowerupExpired<RepelPowerup>();
//etc etc
虽然这不是整洁或可扩展的。
编辑:
我忘了添加。我不能拥有通用类型的原因是因为我将使用GetComponent<T>()
中的参数类型传递来使用Unity PowerupExpired
方法,该方法不接受泛型类型。
答案 0 :(得分:1)
你的意思是如下吗?我真的不明白你想要什么,但我试了一下。
使Powerup成为一个抽象类,只是所有其他通电的基类。
public abstract class Powerup
{
// common behaviour for all powerups
}
然后每种类型的powerup都将从这个基类继承。
public class BombPowerup : Powerup
{
// specific behaviour
}
声明PowerupExpired方法,使其获取参数。
public void PowerupExpired<T>(T param) where T : Powerup
{
// for example print a type of an argument
Console.WriteLine(param.GetType().Name);
}
试试。
PowerupExpired(new BombPowerup());
答案 1 :(得分:1)
从您的代码中,它看起来非常像您希望在PowerupExpired
中执行不同的操作,具体取决于它是炸弹还是击退。那么为什么不用两种方法呢?
答案 2 :(得分:1)
如果使用泛型方法的唯一原因是使用泛型统一方法,请不要使用泛型统一方法。
有一种替代方法GetComponent(Type t)
,您可以在其中传入类型(它实际上更健壮,例如,您可以传入接口而不是从组件继承的类)。
你的代码看起来像(像):
public void PowerupExpired(PowerUp p)
{
PowerUp powerUpComponent = GetComponent(p.GetType());
}
,其中
class BombPowerup : Powerup
{}
和
class RepelPowerup : Powerup
{}
并且可能是
class Powerup : Component
{}