ano*_*ous 3 c# generics interface
也许我很笨,但......
我有:
public interface IRequest
{
IList<IRequestDetail> Details { get; set; }
// stuff
}
public interface IRequestDetail
{
// stuff
}
Run Code Online (Sandbox Code Playgroud)
然后我有:
public class MyRequest : IRequest
{
IList<MyRequestDetail> Details {get; set; }
// stuff
}
public class MyRequestDetail : IRequestDetail
{
// stuff
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.
C#对我很生气,因为MyRequest由于没有IRequestDetail的IList而没有实现接口.
现在,如果我更改它以便细节是IRequestDetail的IList,那么我必须将它转换为MyRequestDetail代码中的任何地方我使用非接口成员(我有几个请求共享常见的东西,但然后专门化).
我有点理解为什么它错了,但并不完全!
Mic*_*ows 12
我认为,基于问题是您希望将详细信息视为通用列表并强制实施IRequestDetail的问题.您还希望为实现类更具体地键入它.在这种情况下,您需要使IRequest通用.
试试这个:
public interface IRequest<T> where T : IRequestDetail
{
IList<T> Details { get; set; }
// stuff
}
public class MyRequest : IRequest<MyRequestDetail>
{
public IList<MyRequestDetail> Details {get; set; }
// stuff
}
Run Code Online (Sandbox Code Playgroud)
这应该适合你.
编辑2017-03-17
在回复@ Robert的评论时,请参阅下面的扩展代码:
public interface IRequestDetail
{
}
public class MyRequestDetail : IRequestDetail
{
}
public interface IRequest<T> where T : IRequestDetail
{
IList<T> Details { get; set; }
// stuff
}
public class MyRequest<T> : IRequest<T>
where T : IRequestDetail
{
public IList<T> Details { get; set; }
// stuff
}
public class Consumer
{
public void MyFunction<T>(IRequest<T> request)
where T : IRequestDetail
{
}
public void Foo()
{
var test = new MyRequest<MyRequestDetail>();
MyFunction(test);
}
}
Run Code Online (Sandbox Code Playgroud)