C# 从两个分层接口继承?

C# 从两个分层接口继承?,c#,C#,我有两个接口,其中一个具有泛型类型。但是当我尝试使用它们时,我不能 第一个界面是: interface IGene { string Name { get; set; } int Index { get; set; } } 二是: interface IChromosome<X> where X :IGene { double Fitness { get; } X[] Genes { get; set; } } interface IChromos

我有两个接口,其中一个具有泛型类型。但是当我尝试使用它们时,我不能

第一个界面是:

interface IGene
{
    string Name { get; set; }
    int Index { get; set; }
}
二是:

interface IChromosome<X> where X :IGene
{
    double Fitness { get; }
    X[] Genes { get; set; }
}
interface IChromosome其中X:IGene
{
双重适应度{get;}
X[]基因{get;set;}
}
实现这些功能的类:

class GAMachine<T> where T : IChromosome<X> where X:IGene
{
   //......
}
类GAMachine,其中T:IChromosome,其中X:IGene
{
//......
}

在最后一段代码中,它给出了一个错误。我如何编写这种层次顺序?有其他选择吗?

这是因为您没有在泛型类型定义中的类定义中定义X。我想你想要的是这个

class GAMachine<T> where T : IChromosome<IGene>
{
   //....
}
类GAMachine,其中T:IChromosome
{
//....
}
还是这个

class GAMachine<T, X> where T : IChromosome<X> where X : IGene
{
   //....
}
类GAMachine,其中T:IChromosome,其中X:IGene
{
//....
}

这是因为您没有在泛型类型定义中的类定义中定义X。我想你想要的是这个

class GAMachine<T> where T : IChromosome<IGene>
{
   //....
}
类GAMachine,其中T:IChromosome
{
//....
}
还是这个

class GAMachine<T, X> where T : IChromosome<X> where X : IGene
{
   //....
}
类GAMachine,其中T:IChromosome,其中X:IGene
{
//....
}

出现了什么错误?
找不到类型或名称空间名称“X”
,它说出现了什么错误?
找不到类型或名称空间名称“X”
,它说对于您的第一个解决方案,我有一个新问题。如果使用
,比较两个IGene实例时是否会出现问题?我的代码使用比较,类用户能够为实现的
X
类编写不同的比较方法。所以,如果使用
,我可以比较两个相同类型的变量吗?因为如果我没说错的话,我知道接口不能包含比较方法,只有从接口继承的类可以。@AliTor-不应该,但它取决于您的实现。理想情况下,您应该在要进行比较的具体类型上重写Equals和GetHashCode。您还可以在具体类型上实现泛型IEquals以执行比较。然后,当您实际比较实例时,具体的相等实现应该接管。但这取决于你如何实现你的比较,所以我不能肯定。正如我从你那里了解到的,我应该创建一个额外的
IEquals
,其中包含一个
Equals
方法。我还需要用户添加一个方法来检查相等性,这种方式足以强制用户向继承的类添加相等性方法,是吗?@AliTor-如果您要求/期望
IGene
的实现者也提供合适的均衡方法,传达这种期望的最简单方法是将
IGene
定义为
接口IGene:IEquatable
,请参阅。对于您的第一个解决方案,我有一个新问题。如果使用
,比较两个IGene实例时是否会出现问题?我的代码使用比较,类用户能够为实现的
X
类编写不同的比较方法。所以,如果使用
,我可以比较两个相同类型的变量吗?因为如果我没说错的话,我知道接口不能包含比较方法,只有从接口继承的类可以。@AliTor-不应该,但它取决于您的实现。理想情况下,您应该在要进行比较的具体类型上重写Equals和GetHashCode。您还可以在具体类型上实现泛型IEquals以执行比较。然后,当您实际比较实例时,具体的相等实现应该接管。但这取决于你如何实现你的比较,所以我不能肯定。正如我从你那里了解到的,我应该创建一个额外的
IEquals
,其中包含一个
Equals
方法。我还需要用户添加一个方法来检查相等性,这种方式足以强制用户向继承的类添加相等性方法,是吗?@AliTor-如果您要求/期望
IGene
的实现者也提供合适的均衡方法,传达这种期望的最简单方法是将
IGene
定义为
接口IGene:IEquatable
,请参阅。