gpt4 book ai didi

c# - 在 .NET 中有什么方法可以继承没有构造函数的类吗?

转载 作者:太空狗 更新时间:2023-10-29 19:59:18 26 4
gpt4 key购买 nike

我目前正在尝试修改一些 HttpWebRequest 函数,但我无法通过继承来完成,因为 HttpWebRequest 没有公共(public)构造函数(除了反序列化构造函数)。有解决方法吗?

我的目标是编写类似于下面示例的代码,但是此类对象必须继承 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();
}
}
}

最佳答案

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

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

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

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();
}

}
}

关于c# - 在 .NET 中有什么方法可以继承没有构造函数的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/400565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com