![]() |
1
5
您的
从您的问题中不清楚枚举策略将如何与您的collection类交互。看起来你可能在追求这样的东西:
请注意,还可以用简单的策略替换strategy类
|
![]() |
2
0
我建议您首先创建函数GetEnumeratorInFirstStyle、GetEnumeratorInSecondStyle等(当然,要使用适合您的应用程序的名称),然后创建新的结构,例如(vb语法中的示例,但应该很容易转换为C#): Class enumTest Function GetEnumeratorInFirstStyle() As IEnumerator(Of Integer) Return Enumerable.Empty(Of Integer)() ' Real code would do something better End Function Private Structure FirstStyleEnumerable Implements IEnumerable(Of Integer) Private myEnumTest As enumTest Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Integer) Implements System.Collections.Generic.IEnumerable(Of Integer).GetEnumerator Return myEnumTest.GetEnumeratorInFirstStyle End Function Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator Return myEnumTest.GetEnumeratorInFirstStyle End Function Sub New(ByVal newEnumTest As enumTest) myEnumTest = newEnumTest End Sub End Structure Public ReadOnly Property AsFirstStyleEnumerable As IEnumerable(Of Integer) Get Return New FirstStyleEnumerable(Me) End Get End Property End Class 请注意,使用的是结构而不是类,因为使用类需要创建一个新的堆对象并为其访问添加额外的间接级别;该结构的真正目的是允许它实现与封装对象“不同”的IEnumerable<T>。顺便说一句,可以将泛型与标记类一起使用,以避免为枚举的每个变体手动定义新的FirstStyleEnumerator结构。不过,我不确定这是更干净还是更混乱。 Interface IQualifiedEnumerable(Of T, U) Function GetEnumerator() As IEnumerable(Of U) End Interface Structure QualifiedEnumerableWrapper(Of T, U) Implements IEnumerable(Of U) Private myEnumerable As IQualifiedEnumerable(Of T, U) Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of U) Implements System.Collections.Generic.IEnumerable(Of U).GetEnumerator Return myEnumerable.GetEnumerator End Function Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator Return myEnumerable.GetEnumerator End Function Sub New(ByVal newEnumerable As IQualifiedEnumerable(Of T, U)) myEnumerable = newEnumerable End Sub End Structure Class EnumTest2 Implements IQualifiedEnumerable(Of FirstEnumerationStyle, Integer) Implements IQualifiedEnumerable(Of SecondEnumerationStyle, Integer) Private Class FirstEnumerationStyle ' Marker classes for generics End Class Private Class SecondEnumerationStyle End Class Private Function GetFirstStyleEnumerator() As System.Collections.Generic.IEnumerable(Of Integer) Implements IQualifiedEnumerable(Of FirstEnumerationStyle, Integer).GetEnumerator Return Enumerable.Empty(Of Integer)() End Function Private Function GetSecondStyleEnumerator() As System.Collections.Generic.IEnumerable(Of Integer) Implements IQualifiedEnumerable(Of SecondEnumerationStyle, Integer).GetEnumerator Return Enumerable.Empty(Of Integer)() End Function Public ReadOnly Property AsFirstStyleEnumerable As IEnumerable(Of Integer) Get Return New QualifiedEnumerableWrapper(Of FirstEnumerationStyle, Integer) End Get End Property Public ReadOnly Property AsSecondStyleEnumerable As IEnumerable(Of Integer) Get Return New QualifiedEnumerableWrapper(Of SecondEnumerationStyle, Integer) End Get End Property End Class 在这里,接口和结构的定义完全是通用的;向类中添加每个额外的枚举方法需要添加一个函数来返回其枚举数,并添加一个属性来返回适当类型的qualifiedEnumerableRapper。 |
|
3
0
在课堂上,你可以:
|
![]() |
Sinatr · 警告-未实现“收集”模式 7 年前 |
![]() |
KDecker · 按完成时间排序任务,同时在参数列表中跟踪其索引? 9 年前 |
![]() |
Gustaf Liljegren · 如何在所有Y对象中获取所有X对象? 10 年前 |