我意识到不可能从泛型类型参数派生,并且我理解如果允许会出现的所有复杂情况。
所以我的问题是,我该如何解决这个问题?我正在尝试消除一些重复的代码,而我想出的最佳解决方案(这不是解决方案,因为它无法完成)将是执行以下操作:
public class Proxy<T> : T where T : CommonBaseClass
我想要这样做的原因是覆盖CommonBaseClass
.
这是我项目中的一些实际代码示例:
public class ReportingServiceProxy : ReportingService2010
{
protected override WebResponse GetWebResponse (WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
// Do override stuff here
return response;
}
}
public class ReportingExecutionProxy : ReportExecution2005
{
protected override WebResponse GetWebResponse (WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
// Do override stuff here
return response;
}
}
在上面的示例中,ReportingService2010
&ReportExecution2005
类都派生自SoapHttpClientProtocol
哪个派生自HttpWebClientProtocol
。和 中的覆盖方法GetWebResponse
和GetWebRequest
两者的覆盖方法HttpWebClientProtocol
是相同的。这些方法是我试图重构的代码重复存在的地方。
为了完整起见,这里有一些额外的代码,我在其中实现了上面的代码:
public abstract class SSRSReportBase<T> where T : new()
{
protected T ssrs;
protected abstract void ServiceLogon();
public SSRSReportBase()
{
ServiceLogon();
// Do other common constructor work here.
}
}
// Implementation #1
public class SSRSReportExecution : SSRSReportBase<ReportExecutionProxy>
{
protected override void ServiceLogon()
{
ssrs.LogonUser("LoginName", null, null);
}
// Create additional wrapper methods for ReportExecution2005
}
// Implementation #2
public class SSRSReportingService : SSRSReportBase<ReportingServiceProxy>
{
protected override void ServiceLogon()
{
ssrs.LogonUser("LoginName", null, null);
}
// Create additional wrapper methods for ReportingService2010
}
我想出的唯一解决方案不是一个可能的解决方案,所以显然它不是一个解决方案。这是错误的代码:
public class ReportProxy<T> : T where T : HttpWebClientProtocol, new()
{
protected override WebResponse GetWebResponse (WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
return response;
}
}
// Implementation #1
public class SSRSReportExecution : SSRSReportBase<ReportProxy<ReportExecution2005>>
{
}
// Implementation #2
public class SSRSReportingService : SSRSReportBase<ReportProxy<ReportingService2010>>
{
}
问题: 所以我的问题是,如何重构此代码以删除重复代码(GetWebRequest
和GetWebResponse
覆盖)?