在.NET中有没有办法继承没有构造函数的类?

时间:2008-12-30 15:32:05

标签: c# .net inheritance httpwebrequest

我目前正在尝试修改一些HttpWebRequest函数,但我无法通过继承来实现,因为HttpWebRequest没有公共构造函数(除了反序列化构造函数)。有没有办法解决这个问题?

我的目标是编写类似下面示例的代码,但此类对象必须继承HttpWebRequest属性和方法:

using System;
using System.Net;
using System.Threading;

public class AsyncWebRequest:WebRequest
{
    private readonly AsyncCallback getResponseCallback;
    private readonly Uri uri;
    private volatile int RetriesLeft = 3;
    private volatile WebRequest request;

    public AsyncWebRequest(string uri, AsyncCallback getResponseCallback)
       :this(new Uri(uri), getResponseCallback)
    {
    }

    public AsyncWebRequest(Uri uri, AsyncCallback getResponseCallback):base()
    {
        this.uri = uri;
        this.getResponseCallback = getResponseCallback;
    }

    private IAsyncResult BeginGetResponse()
    {
        request = HttpWebRequest.CreateDefault(uri);
        ((HttpWebRequest)request).ReadWriteTimeout = Timeout;
        var result = request.BeginGetResponse(GetResponseCallback, null);
        ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
            GetResponseTimeout, null, Timeout, true);
        return result;
    }

    private void GetResponseTimeout(object state, bool timedOut)
    {
        if (timedOut)
        {
            Retry();
        }
    }

    private void Retry()
    {
        request.Abort();
        bool retry = false;
        lock (request)
        {
            if (RetriesLeft > 0)
            {
                Interlocked.Decrement(ref RetriesLeft);
                retry = true;
            }
        }
        if (retry)
        {
            BeginGetResponse();
        }
        else
        {
            getResponseCallback(null);
        }
    }

    private void GetResponseCallback(IAsyncResult AsyncResult)
    {
        try
        {
            getResponseCallback(AsyncResult);
        }
        catch(WebException webException)
        {
            Retry();
        }
    }
}

2 个答案:

答案 0 :(得分:12)

你不能通过继承来自HttpWebRequest(如果你不想调用序列化构造函数),但你可以通过组合和委托,以及通过WebRequest的继承(我不确定是否会这样做)你,但在功能上它非常相似)。 WebRequest有一个默认的构造函数。

在这种情况下,你不能让类'是'一个HttpWebRequest(就像在一个is-a关系中),因为你不能从它扩展,但它将是一个WebRequest,这应该足够了

你可以写一个继承自WebRequest的类,它有一个类型为WebRequest的实例成员,创建一个HttpWebRequest并在新类型的构造函数中赋值给实例成员,并委托对该引用的所有调用(一种装饰模式) ):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;

namespace ClassLibrary1
{
    public class MyHttpWebRequest : WebRequest
    {
        private WebRequest request;

        public MyHttpWebRequest(string uri)
        {
            request = HttpWebRequest.Create(uri);
        }

        public override WebResponse GetResponse()
        {
            // do your extras, or just delegate to get the original code, as long
            // as you still keep to expected behavior etc.
            return request.GetResponse();
        }

    }
}

答案 1 :(得分:4)

除非你能欺骗序列化构造函数来进行竞标,否则就没有办法了。

该类的构造函数是内部的,因此您无法调用它们。