我有一个班级:
public abstract class Structure<T, S> : IStructure
where T : StructureModel<S>, new()
where S : StructureStats, new()
{
protected T _model;
public S Stats { get { return _model.Stats; } set { _model.Stats = value; } }
}
和界面:
public interface IStructure
{
StructureStats Stats{ get; set;}
}
代码无法编译,并带有消息
错误28&#39; Server.Models.Structures.Structure&#39;没有实现接口成员&#39; Server.Models.Structures.IStructure.Stats&#39;。 &#39; Server.Models.Structures.Structure.Stats&#39;无法实现&#39; Server.Models.Structures.IStructure.Stats&#39;因为它没有匹配的返回类型&#39; Server.Models.Structures.StructureStats&#39;。 C:\ SRDevGit \ freecon星系服务器\ SRServer \ Server.Models \结构\ Structure.cs
我不确定问题是什么; Structure.Stats {get;}的返回类型应该保证与接口定义匹配,因为泛型类型S被定义为从StructureStats派生
where S:StructureStats, new()
我错过了什么?如果可能的话,我想避免使IStructure变得通用,因为它会使
的集合复杂化<IStructure<GenericType>>
因为GenericType是一个多态类。
答案 0 :(得分:4)
C#是强类型的,而不支持协变返回类型,因此要从IStructure继承,Structure必须返回确切的签名StructureStats Stats{ get; set;}
。像StructureStatsDerived Stats{ get; set;}
这样的东西不完全匹配,编译器拒绝它。
看起来你实际上并不需要通用参数S.你可以删除S并返回StructureStats。
答案 1 :(得分:0)
没有使用通用接口就无法实现它,您还需要在self.response.write(template.render(extracted_output=extracted_output))
的通用约束中切换顺序
Structure<T, S>