我正在为C#开发抽象代数库,但是在实现接口时遇到了麻烦。我已经为某些小组使用了该实现,但是尝试创建环会给我带来一些严重的问题。特别是,我有以下内容:
public class Scaffolding {
public interface IMonoid<T> : ISemiGroup<T> {
T Identity { get; set; }
}
public interface IGroup<T> : IMonoid<T> {
T Inverse(T a);
}
public interface IRing<T> {
IGroup<T> AdditiveStructure { get; set; }
IMonoid<T> MultiplicativeStructure { get; set; }
}
}
public class ModularMonoid : Scaffolding.IMonoid<int> {
// Implements all necessary monoid properties
}
public class ModularGroup : Scaffolding.IGroup<int> {
// Implements all necessary group properties
}
public class ModularRing : Scaffolding.IRing<int> {
public ModularGroup AdditiveStructure { get; set; }
public ModularMonoid MultiplicativeStructure { get; set; }
// Implement ring-specific properties
}
我收到一条错误消息,指出“ ModularRing”未实现接口成员“ Scaffolding.IRing.AdditiveStructure”。 'ModularRing.AdditiveStructure'无法实现'Scaffolding.IRing.AdditiveStructure',因为它没有匹配的返回类型'Scaffolding.IGroup'。我对MultiplicativeStructure遇到类似的错误。这对我来说很奇怪,因为ModularGroup和ModularMonoid都分别实现了IGroup和IMonoid。
答案 0 :(得分:4)
是的,这些类实现了接口,但是该接口没有说“ AdditiveStructure
属性的类型是实现IGroup<T>
的东西”,而是说{{1的类型}}属性是 AdditiveStructure
。要实现该接口,您必须完全匹配返回类型 。
如果您希望能够实现这样的接口,则需要更改该接口,可能是这样的:
IGroup<T>
然后将其实现为:
public interface IRing<T, TGroup, TMonoid>
where TGroup : IGroup<T>
where TMonoid : IMonoid<T>
{
TGroup AdditiveStructure { get; set; }
TMonoid MultiplicativeStructure { get; set; }
}
或者,您应该考虑将属性设置为只读。这样,如果您对仅使用public class ModularRing : Scaffolding.IRing<int, ModularGroup, ModularMonoid>
{
public ModularGroup AdditiveStructure { get; set; }
public ModularMonoid MultiplicativeStructure { get; set; }
}
和ModularRing
定义的IGroup<int>
用户感到满意(而不是依赖于IMonoid<int>
和{{1} }),那么您可以只使用单一类型参数,这样可以简化很多事情。例如:
ModularGroup
实施:
ModularMonoid
(或在构造函数中接受它们;对于您要如何使用它们,我不太了解。)