我想知道这段代码是否可以改进。 IProvider实现IProvider并覆盖Request(...)。我想将它们组合成一个单独的界面。但是我仍然需要一个可以使用的类型和无类型接口。
有没有办法将这两种方法结合起来,或者这是接口的外观?
public interface IProvider
{
DataSourceDescriptor DataSource { get; set; }
IConfiguration Configuration { get; set; }
IResult Request(IQuery request);
}
public interface IProvider<T> : IProvider
{
new IResult<T> Request(IQuery request);
}
答案 0 :(得分:5)
如果泛型类型参数T
仅与Request
方法的上下文相关,则仅将该方法声明为通用:
public interface IProvider
{
DataSourceDescriptor DataSource { get; set; }
IConfiguration Configuration { get; set; }
IResult Request(IQuery request);
IResult<T> Request<T>(IQuery request);
}
答案 1 :(得分:2)
如果您希望能够执行无类型代码,则无法将该方法放在泛型类中(并且设计仍然有意义)。所以答案是否定的......当你需要无类型和类型化的接口时,你所拥有的是正确的方法。
但是,您可以引用初始接口或将它们全部转换为单个接口,但是仍然必须在泛型类中声明无类型方法,即:
ObjectProvider<SomeObjectType> j = new ObjectProvider<SomeObjectType>();
j.DataSource = //Do something
现在,您始终可以将Request指定为通用方法,并允许两者存在于同一上下文中......但......最终由您决定。
public interface IProvider
{
IResult<T> Request<T>(IQuery request);
DataSourceDescriptor DataSource { get; set; }
IConfiguration Configuration { get; set; }
IResult Request(IQuery request);
}
答案 2 :(得分:0)
实际上,实现接口意味着您也将基本接口的成员保留在子级中 - 当然,继承也是这样做的。
那么,当你通过某个类实现你的子(通用)接口时会发生什么?对于rouse,你将在实现者类中获得泛型和非泛型成员,这不是我想要的那样。
解决方案:
有道理吗?