我有一个树型类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>项目。

10-04 11:04