无法实现接口成员,因为它没有匹配的返回类型

时间:2018-07-28 16:42:39

标签: c#

我正在为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。

1 个答案:

答案 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

(或在构造函数中接受它们;对于您要如何使用它们,我不太了解。)