我在具有泛型返回类型的抽象类中定义了一个抽象方法。但是,当我尝试将泛型类型用作Vector3 (或任何其他变量)时,我会得到以下错误:
这是我的代码:错误在行中
return direction;
using UnityEngine;
public class DashAbility : Ability
{
public Vector3 direction;
public override Vector3 getAbilityData<Vector3>()
{
return direction;
}
public override bool trigger(pointerData pointer)
{
return InputMaster.tryPointer(rollInputTest);
}
bool rollInputTest(pointerData p)
{
return (p.phase == pointerPhase.Dragging) && p.startHit.collider.CompareTag("Player");
}
}
这是我从以下课程中派生出来的:
using UnityEngine;
public abstract class Ability : MonoBehaviour
{
public abstract bool trigger(pointerData pointer);
public abstract T getAbilityData<T>() ;
}
发布于 2020-06-17 23:58:19
当你写这个时:
public override Vector3 getAbilityData<Vector3>()
{
return direction;
}
它想要从这里重写:
public abstract T getAbilityData<T>() ;
在这个函数中,<T>
是一个占位符,表示“一些任意类型,我将调用T”。
因此,为了匹配这一点,编译器必须将<Vector3>
解释为“一些我将调用的任意类型的Vector3”-即。它不再引用UnityEngine.Vector3
类型,它只是使用字符串"Vector3“作为此任意类型的占位符,与父类型匹配。
当然,从实际的UnityEngine.Vector3
和我们称之为"Vector3“的任意类型中没有任何隐式转换,但也可以很容易地成为int
、bool
或.
看起来你的意思是这样的:
// "There are different kinds of ability, each with their own data type"
public abstract class Ability<T> : MonoBehaviour
{
public abstract bool trigger(pointerData pointer);
// "The getAbilityData method returns an instance of this particular ability's data type"
public abstract T getAbilityData();
}
// "DashAbility is an Ability that uses Vector3 data"
public class DashAbility : Ability<Vector3>
{
public Vector3 direction;
public override Vector3 getAbilityData()
{
return direction;
}
// ...
}
在这里,我们将T
限制为每种派生形式的Ability
的一种特定类型。对于DashAbility
,它是UnityEngine.Vector3
,所以现在DashAbility.getAbilityData()
不再需要使用版本来处理任何任意类型,只有真正的实际Vector3
版本。
https://gamedev.stackexchange.com/questions/183622
复制相似问题