我有一个树型类Foo<T>
及其接口IFoo<T>
。
我希望Foo<T>
能够在IEquatable<Foo<T>>
时实现T : IEquatable<T>
(或更普遍的是,如果T : I<T>
除了其他实现的接口,我可能还希望Foo<T> : I<Foo<T>>
)。
我尝试了以下伪代码:
public interface IFoo<T> : IEnumerable<IFoo<T>>
...
public class Foo<T> : IFoo<T>
...
public interface IFooTwo<T> : IFoo<T>, IEquatable<IFooTwo<T>>
where T : IEquatable<T>
...
public class FooTwo<T> : IFooTwo<T> {
... // I implement Equals
public bool NewMethod(FooTwo<T> Other) { ... }
}
因此,现在我已经成功实现了
Equals
(我也重写了一般的Equals等)。但是
FooTwo<T>
现在不实现IEnumerable<IFooTwo<T>>
(相反,它实现了IEnumerable<IFoo<T>>
)。所以我有两个问题:
我是否有更好的方法来组织代码以实现自己的目标(如果
T : IEquatable<T>
我想能够为IEquatable<Foo<T>>
实现Foo<T>
)?一系列条件where
。如何使
FooTwo<T>
使用以下内容实现IEnumerable <FooTwo<T>>
Foo<T> IEnumerable
以快速简便的方式实施?编辑:
在
IEquatable<Foo<T>>
的特殊情况下,我对问题1有一个简单的答案。我可以测试是否T:IEquatable<T>
并在需要时更改IEquatable<Foo<T>>
的实现。但是,我仍然想知道在更一般的情况下该如何做。 最佳答案
由于您实际上是在尝试将某些IFoo<T>
对象设置为IEquatable<T>
,而另一些则不是,并且这显然与类型系统不符,因此我将完全避免使用IEquatable<T>
。使用IEqualityComparer<T>
。只需提供一种在给定IEqualityComparer<IFoo<T>>
时创建IEqualityComparer<T>
的方法(或根据需要使用T
的默认比较器)。
这样,所有IFoo<T>
对象都没有义务进行自我比较,但是任何人都可以创建一种共同映射IFoo<T>
对象的方法,只要他们知道如何比较基础对象。
这也完全消除了对IFoo<T>
的多种实现的需要,大大简化了整个代码库,并彻底消除了其他问题。
如何使FooTwo<T>
使用以下内容实现IEnumerable<FooTwo<T>>
Foo<T> IEnumerable
以快速简便的方式实施?
(如果您选择不遵循我的建议来更改您处理平等的方式:)
如果您知道序列中的所有项目实际上都是正确的类型,则只需在序列中使用Cast<FooTwo<T>>()
即可。
如果序列中的项目实际上不是FooTwo<T>
对象,则需要将这些项目投影到新序列中,在该序列中,每个IFoo<T>
项目都映射到FooTwo<T>
项目。