功能模板(T为数字)?

时间:2017-02-23 16:12:19

标签: vb.net polymorphism

我希望创建一个使用输入上常用算术函数的多态函数,它是一个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

2 个答案:

答案 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

现在似乎有效。但是这意味着我必须进行投射,这不是我的第一个意图:不是真正的多态,有双重写。我提出问题是为了更好的解决方案。