1

我意识到不可能从泛型类型参数派生,并且我理解如果允许会出现的所有复杂情况。

所以我的问题是,我该如何解决这个问题?我正在尝试消除一些重复的代码,而我想出的最佳解决方案(这不是解决方案,因为它无法完成)将是执行以下操作:

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。和 中的覆盖方法GetWebResponseGetWebRequest两者的覆盖方法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>>
{
}

问题: 所以我的问题是,如何重构此代码以删除重复代码(GetWebRequestGetWebResponse覆盖)?

4

1 回答 1

1

一个解决方案是根本不使用泛型并使用工厂模式。而不是具有BaseClassnew()约束的通用参数。键入所有内容BaseClass并为new(). 这可以是完整的工厂类或轻量级工厂委托。

public interface IProtocolFactory
{
    ProtocolBaseClass Create();
}

public class SomeDerivedProtocolFactory : IProtocolFactory
{
    public ProtocolBaseClass Create()
    {
        return new SomeDerivedProtocol();
    }
}

您甚至可以在工厂中添加额外的初始化代码。

public class ReportProxy
{
    private IProtocolFactory _factory;

    public ReportProxy(IProtocolFactory factory)
    {
        _factory = factory;
    }

    public void DoSomething()
    {
        ProtocolBaseClass protocol = _factory.Create();
        ...
    }
}

使用委托

    private Func<ProtocolBaseClass> _createProtocol;

    public ReportProxy(Func<ProtocolBaseClass> createProtocol)
    {
        _createProtocol= createProtocol;
    }

    public void DoSomething()
    {
        ProtocolBaseClass protocol = _createProtocol();
        ...
    }
于 2012-10-31T17:37:00.030 回答