Как я могу скрыть и переопределить унаследованный метод в F #? - PullRequest
1 голос
/ 13 марта 2020

Я хочу создать поддельный обработчик для HttpClient, поэтому я определяю его так:

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>

Мое намерение - создать перезаписываемый метод publi c, который может быть смоделирован с помощью Foq и который просто вызывается в base SendAsync.

Если я называю абстрактный метод по-другому, например, MockableSendAsync компилятор не жалуется, но возможно ли повторно использовать имя? (Можно ли сделать метод запечатанным?)

1 Ответ

1 голос
/ 13 марта 2020

Если я правильно понимаю проблему, проблема в том, что виртуальный метод SendAsync в HttpMessageHandler имеет значение protected, но он хочет создать тип, в котором он равен public, чтобы его можно было легко смоделировать.

Я не думаю, что есть способ скрыть виртуальный метод с помощью другого нового (publi c) вирулентного метода в F #, но я думаю, что ваш вариант использования сработает, если вы определили вирусный метод с другим именем и вызвал его из оригинального SendAsync метода:

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)
...