Kum*_*mba 4 vb.net generics operator-overloading
我假设"不",但我无法找到谷歌的确凿证据来支持这一假设.使用'vb.net'的关键字,泛型运算符重载"'只产生1个结果,删除'重载'会产生更多,但没有直接声明该问题.
我的想法是给出一个抽象类,能够实现一个泛型运算符重载是很棒的,派生类可以在这种情况下使用,当所述运算符重载必须返回派生类的新副本时,代码对于每个重载都是一样的.如果那有意义的话.
这倒是回到我以前在我的自定义枚举类的问题和重载位运算符(And,Or,Not,和Xor),但是,这种特殊的思想是由的"能不能做到?"一个单纯的好奇心提示.
这是我的一个自定义枚举基本上看起来像:
父,EBase没什么特别的,只是托管公共Name和Value属性,加上两个共享运算符,op_Equality和op_Inequality.
Friend NotInheritable Class EExample
Inherits EBase
Private Sub New()
End Sub
Friend Shared Function GetValue(ByVal Name As String) As Enums
Dim tmpOffset As Int32 = Array.IndexOf(_Names, Name)
Return If(HasContent(Name), If(tmpOffset <> -1, Values(tmpOffset), Nothing), Nothing)
End Function
' Num of Enums defined.
Friend Shared ReadOnly MaxEnums As Int32 = 5
' String literals.
Private Shared ReadOnly _Names As String() = New String() _
{"one_adam", "two_boy", "three_charles", "four_david", "five_edward"}
' Enums.
Friend Shared ReadOnly OneA As New Enums(_Names(0), 1)
Friend Shared ReadOnly TwoB As New Enums(_Names(1), 2)
Friend Shared ReadOnly ThreeC As New Enums(_Names(2), 4)
Friend Shared ReadOnly FourD As New Enums(_Names(3), 8)
Friend Shared ReadOnly FiveE As New Enums(_Names(4), 16)
' Enum Values Array.
Friend Shared ReadOnly Values As Enums() = New Enums() _
{OneA, TwoB, ThreeC, FourD, FiveE}
Friend NotInheritable Class Enums
Inherits EBase
Private Sub New()
End Sub
Friend Sub New(ByVal Name As String, ByVal Value As Int32)
MyBase.Name = Name
MyBase.Value = Value
End Sub
End Class
End Class
Run Code Online (Sandbox Code Playgroud)
以下是使用方法:
Dim Foo As EExample.Enums
Foo = EExample.TwoB
Debug.Print(Foo.Name)
Run Code Online (Sandbox Code Playgroud)
将打印 two_boy
现在,鉴于此,如果我想做以下事情:
Dim Foo as EExample.Enums
Foo = EExample.OneA Or EExample.FiveE
Run Code Online (Sandbox Code Playgroud)
我必须定义一个运算符重载为Or 内部的EExample.Enums定义.这个操作员怎么过载?
Public Shared Operator Or(ByVal lhOp As Enums, ByVal rhOp As Enums) As Enums
Return New Enums(String.Concat(lhOp.Name, "|"c, rhOp.Name),
lhOp.Value Or rhOp.Value, True)
End Operator
Run Code Online (Sandbox Code Playgroud)
我必须返回一个EEXample.Enums包含Value父EExample枚举的Bitwise-Or'ed 属性的新对象.对于名称,我只是将Name属性与管道字符连接起来,直到我想到更好的东西.
假设我有20个类似的枚举类EExample.我必须为每个定义复制所有运算符重载代码,即使在IDE中,它看起来完全相同.但是,在IL中,每个重载都特定于包含的父枚举类:
.method public specialname static class MyAssembly.EExample/Enums
op_BitwiseOr(class MyAssembly.EExample/Enums lhOp,
class MyAssembly.EExample/Enums rhOp) cil managed
{ ... }
Run Code Online (Sandbox Code Playgroud)
但!如果在EBase!中定义,泛型运算符重载将解决此问题!
Friend Interface IEnums
Property Name As String
Property Value As Int32
End Interface
Public Shared Operator Or(Of T As IEnums)(ByVal lhOp As T, ByVal rhOp As T) As T
Return New T(String.Concat(lhOp.Name, "|"c, rhOp.Name),
lhOp.Value Or rhOp.Value, True)
End Operator
Run Code Online (Sandbox Code Playgroud)
然后(理论上无论如何),调用EExample.OneA Or EExample.FiveE将起作用,因为编译器会知道调用泛型运算符重载EBase,知道EExample.Enums匹配IEnums接口约束,并自动提供T.
那个或者我只是在没有划桨和过度分析的情况下在这里游泳.但这是一个有趣的想法,不是吗?StackOverflow的共识是什么?我需要稍微裁掉Spice吗?
PS:我知道,在最后一个例子中,它Return New T( ... )是无效的,但我想不出一个能够表达基本思想的正确语法.
| 归档时间: |
|
| 查看次数: |
1005 次 |
| 最近记录: |