我希望创建一个使用输入上常用算术函数的多态函数,它是一个double或整数。例如:
public function Plus(of T )(a as T, b as T) as T
return a+b
end function
显然这不起作用:T并不总是实现+运算符。
我试过了: (T为数字) (T = double,整数)
所有这些显然是错误的。
这也不起作用:
public function Plus(of T )(a as T, b as T) as double
return CType(a, Double)+CType(b, Double)
end function
有没有办法做到这一点?
谢谢!
PS:我还需要这个T是iComparable,例如:
public function PlusStupid(of T as icomparable(of T))(a as T, b as T) as T
return a*a+b*b + (a-b) * a.CompareTo(b)
'returns a²+b²+ b-a if a<b
'returns a²+b²+ a-b if a>b
'returns a²+b² if a=b
end function
答案 0 :(得分:0)
我会手动完成:
Public Function Plus(of T As IComparable)(a As T, b As T) As T
Try
Return a+b
Catch ex As Exception
End Try
End Function
我在VB.Net中真的不知道how to check if a class has overridden the + operator
,所以我把它放在Try / Catch中,如果它不存在就会失败...
修改强>
经过测试和阅读后,我看到(Of T As IComparable)
有效(我今天之前都不知道,感谢评论)。
答案 1 :(得分:0)
找到了解决方法!感谢Polymorphism in VB.Net when dealing with Generics
public function PlusStupid(of T as {IComparable(Of T), IConvertible})(a as T, b as T) as T
return a.ToDouble(nothing)+b.ToDouble(nothing) + a.CompareTo(b)
end function
现在似乎有效。但是这意味着我必须进行投射,这不是我的第一个意图:不是真正的多态,有双重写。我提出问题是为了更好的解决方案。