[英]Interface design implementation error: … cannot implement … because it does not have a matching return type
[英]Interface implementation fails for generic type, because of “does not have the matching return type” error
我有一堂課:
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'Server.Models.Structures.Structure'未實現接口成員'Server.Models.Structures.IStructure.Stats'。 “ Server.Models.Structures.StructureStats”無法實現“ Server.Models.Structures.IStructure.Stats”,因為它沒有匹配的“ Server.Models.Structures.StructureStats”返回類型。 C:\\ SRDevGit \\ freecon星系服務器\\ SRServer \\ Server.Models \\結構\\ Structure.cs
我不確定是什么問題; 應該保證Structure.Stats {get;}的返回類型與接口定義匹配,因為通用類型S被定義為通過以下方式從StructureStats派生
where S:StructureStats, new()
我想念什么? 如果可能的話,我想避免使IStructure通用,因為它會使
<IStructure<GenericType>>
因為GenericType是一個多態類。
C# 是強類型的,並且不支持協變返回類型,因此要從IStructure繼承,Structure必須返回確切的簽名StructureStats Stats{ get; set;}
StructureStats Stats{ get; set;}
。 類似於StructureStatsDerived Stats{ get; set;}
StructureStatsDerived Stats{ get; set;}
不是完全匹配項,編譯器會拒絕它。
看起來您實際上並不需要通用參數S。您可以刪除S並僅返回StructureStats。
沒有使用通用接口就無法實現它,您還需要在通用約束中切換Structure<T, S>
的順序
public class Structure< T, S> : IStructure<S>
where S : StructureStats, new()
where T : StructureModel<S>, new()
{
protected T _model;
public S Stats { get { return _model.Stats; } set { _model.Stats = value; } }
}
public interface IStructure<S> where S : StructureStats
{
S Stats { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.