我意識到不可能從泛型類型參數中派生出來,並且我理解如果允許出現的所有複雜問題。解決從泛型類型參數派生
所以我的問題是,我該如何解決此問題?我想消除一些重複的代碼和最佳解決方案(這不是一個解決方案,因爲它不能做)我想出了將做這樣的事情:
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
覆蓋)?
所以,你想有效地圍繞類(X,Y)的包裝,所以你可以調用一個方法,並獲得X和Y同樣的效果?也許我對你想要的東西感到困惑。 – Tejs
您可以考慮組合而不是繼承來實現您想要做的事情嗎?所以你將有一個T的私人實例,將獲得對GetWebResponse的調用? – nieve
我在想這將是最佳解決方案。拿一個內部的'T'引用,這樣你就可以通過方法將它的操作暴露給底層的'T'實現。 – Tejs