C# 我可以让相同的方法在浮点和/或向量2上运行其逻辑吗?
我有一个类,它的方法有两个值,一个是当前值,一个是目标值。该方法使用这些函数进行一系列数学计算,并返回传入的相同类型的值。它还更新类上相同类型的某些属性 但是,现在我有这个方法的两个副本(以及它更新的类上的每个属性),一个用于float,一个用于Vector2,将来可能需要更多。但是,逻辑是完全相同的(操作是相同的、基本的,并且不关心类型) 有没有办法使这个类不关心传递给它的方法/作为它的属性的值的类型,只要它是float或Vector2?我尝试了泛型方法,但似乎你只能比较泛型而不能进行加法或乘法等 我可以有两个不同的类,但我不想把方程放在两个地方C# 我可以让相同的方法在浮点和/或向量2上运行其逻辑吗?,c#,.net,C#,.net,我有一个类,它的方法有两个值,一个是当前值,一个是目标值。该方法使用这些函数进行一系列数学计算,并返回传入的相同类型的值。它还更新类上相同类型的某些属性 但是,现在我有这个方法的两个副本(以及它更新的类上的每个属性),一个用于float,一个用于Vector2,将来可能需要更多。但是,逻辑是完全相同的(操作是相同的、基本的,并且不关心类型) 有没有办法使这个类不关心传递给它的方法/作为它的属性的值的类型,只要它是float或Vector2?我尝试了泛型方法,但似乎你只能比较泛型而不能进行加法或乘
public float Response { get { return 0.2f; } }
public float Damping { get { return 0.5f; } }
public Vector2 VectorVelocity { get; set; }
public float FloatVelocity { get; set; }
public Vector2 Move(Vector2 current, Vector2 target)
{
Vector2 delta;
delta = target - current;
this.VectorVelocity += delta * this.Response;
current += this.VectorVelocity;
this.VectorVelocity *= this.Damping;
return current;
}
public float Move(float current, float target)
{
float delta;
delta = target - current;
this.FloatVelocity += delta * this.Response;
current += this.FloatVelocity;
this.FloatVelocity *= this.Damping;
return current;
}
这里有一种通用方法,要求您为各种操作传递委托
public T Move<T>(T current, T target,
Func<T, T, T> subtract,
Func<T, T, T> add,
Func<T, float, T> multiplyByFloat,
Action<T> setVelocity,
Func<T> getVelocity,
)
{
T delta = subtract(target, current);
setVelocity(add(getVelocity(), multiplyByFloat(delta, this.Response));
current = add(current, getVelocity());
setVelocity(multiplyByFloat(getVelocity(), this.Damping);
return current;
}
您可以采用这种方法将forumula保留在一个位置,并且仍然有覆盖,为您发出特定的调用,因为每次都必须放入所有这些代理将是痛苦的
我还想声明,对于给定的示例,我不确定这是否值得,但是如果公式更复杂,并且您需要处理3种或更多类型,那么这种方法可能是可行的,但正如您所看到的,公式更难以这种方式阅读。您应该使用泛型类型@PaviełKraskoŭski不,他们不应该这样做,因为你无法生成一个通用的2个浮点参数或一个向量2one@CamiloTerevinto我懂了。因此,您可以创建两个重载方法,其中一个带有Vector2参数的方法将调用另一个带有两个浮点参数的方法。@PaviełKraskoŭski泛型在这里不起作用,因为运算符。没有允许它们的约束。
dynamic
可以在这里工作,尽管它也有自己的一系列问题,比如将编译时检查推到运行时,通常效率较低。此外,结果将是动态的,您可能需要进行一些铸造。非常感谢!即使我最终没有实现它(正如您所说,易读性是一个因素),这种方法也确实帮助我更好地理解泛型和委托。
var result = Move(current, target,
(a,b) => a - b,
(a,b) => a + b,
(a,b) => a * b,
v => this.FloatVelocity = v,
() => this.FloatVelocity);