【发布时间】:2010-10-18 09:30:15
【问题描述】:
我有一个假设的经销商可以提供一些服务;所有服务都是相同的:它们威胁一些 IRequest 数据,加上一些 IExtraData,并提供 IResponse。
请阅读此代码(使用 C# 2.0):
public interface IResellerService<in TIn, in TInExtra, out TOut, in TOutExtra>
where TIn : IRequest
where TInExtra : IExtraData
where TOut : IResponse
where TOutExtra : IExtraData
{
#region Properties
string Code
{
get;
set;
}
//Some other simple properties here...
#endregion
//Some methods there...
}
//Need a collection of IResellerServices; using a IList just to have Add facility
public interface IResellerServices : IList<IResellerService<IRequest, IExtraData, IResponse, IExtraData>>
{
IResellerService<IRequest, IExtraData, IResponse, IExtraData> Get(string code);
void Update(IResellerService<IRequest, IExtraData, IResponse, IExtraData> reseller);
void Delete(string code);
void Disable(string code);
}
public class AvailabilityService : IResellerService<AvailabilityDocumentRequest, AvailabilityInputExtraData, AvailabilityDocumentResponse, AvailabilityOutputExtraData>
{
//Here the interface implementation;
/*
NOTE IResellerService declaration
AvailabilityDocumentRequest : IRequest
AvailabilityInputExtraData : IExtraData
AvailabilityDocumentResponse : IResponse
AvailabilityOutputExtraData : IExtraData
*/
}
[Serializable]
public class Reseller : IReseller
{
#region Properties
public string Code
{
get;
set;
}
[XmlArray("Services")]
[XmlArrayItem("Service")]
public IResellerServices Services
{ get; set; }
//Some other simple properties here...
#endregion
//Some methods there...
}
//Just to make me explain...
void Main()
{
Reseller res = new Reseller;
//Fill reseller properties here...
//...
AvailabilityService service = new AvailabilityService();
//Fill service properties here...
//...
//ERROR!
res.Add(service); //<-- ERROR! Need to cast my AvailabilityService to IResellerService<IRequest, IExtraData, IResponse, IExtraData>
//OK
res.Services.Add(service as IResellerService<IRequest, IExtraData, IResponse, IExtraData>);
}
好吧,我可能错过了继承或接口实现的一些基本概念,但我做错了什么?
希望你能理解我的需要。
【问题讨论】:
-
上面的代码不会在 C# 2.0 中工作 - 它使用了泛型变量,它只在 C# 4.0 中引入。
-
您应该阅读 .net 4.0 中引入的通用接口中的方差概念
-
显示 IReseller.Add 或 Reseller.Add 声明
-
谢谢你们,你们是对的。回到 C# 2.0 让我有点困惑...... :-S
标签: c# .net inheritance interface