首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在F#中同时隐藏和重写继承的方法?

如何在F#中同时隐藏和重写继承的方法?
EN

Stack Overflow用户
提问于 2020-03-13 11:57:32
回答 1查看 74关注 0票数 1

我想为HttpClient创建可模拟的处理程序,所以我将其定义如下:

代码语言:javascript
复制
type TestHandler() = 
    inherit HttpMessageHandler()
    abstract SendAsync: HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>
    override this.SendAsync(request, cancellationToken) = base.SendAsync(request, cancellationToken)

但我知道错误是:

误差FS0361

覆盖SendAsync : HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>实现了多个抽象槽,例如abstract member TestHandler.SendAsync : HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>HttpMessageHandler.SendAsync(request: HttpRequestMessage, cancellationToken: CancellationToken) : Task<HttpResponseMessage>

我的目的是创建可以用Foq模拟的公共可覆盖方法,这个方法在基本SendAsync中被简单地调用。

如果我用不同的名称命名抽象方法,例如MockableSendAsync编译器不会抱怨,但是可以重用这个名称吗?(有可能使方法密封吗?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-13 14:14:06

如果我正确地理解了这个问题,问题是HttpMessageHandler中的虚拟HttpMessageHandler方法是protected,但是希望创建一个public类型,这样就可以很容易地对其进行模拟。

我认为没有办法用F#中的另一种新的(公共) virutal方法隐藏虚拟方法,但我认为如果您定义了一个其他名称的virutal方法并从原始的SendAsync方法调用它,您的用例就会工作:

代码语言:javascript
复制
type TestHandler() = 
    inherit HttpMessageHandler()
    abstract MockableSendAsync: 
        HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>
    default this.MockableSendAsync(request, cancellationToken) = 
        base.SendAsync(request, cancellationToken)
    override this.SendAsync(request, cancellationToken) = 
        this.MockableSendAsync(request, cancellationToken)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60670052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档