用私有构造函数继承一个类?或者创建一个新模块?

时间:2014-01-23 23:48:00

标签: f# f#-data

我正在使用Http类型的FSharpData。

type Http private() = 
    ......
    static member Request(url, ?query, ?headers, ?meth, ?body, ?cookies, ?cookieContainer, ?certificate) =
    ......

但是,我需要扩展静态memeber Request来处理cookie。我不能继承该类,因为它的构造函数是私有的。

type Web () =
    inherit Http() // Error
    override Request
        let ObSSOCookie = new Cookie()
        ......

或者我必须创建一个具有调用静态成员函数的函数的模块?该模块的名称是Http吗?

3 个答案:

答案 0 :(得分:5)

Http类型是一个静态类,因为它是无状态的,所以继承它是没有意义的。如果您想使用Cookie并在请求中维护它们,您只需创建一个CookieContainer并在请求中重复使用它:

let cc = CookieContainer()
Http.RequestString("url1", cookieContainer = cc)
Http.RequestString("url2", cookieContainer = cc)

如果你真的想,你可以像这样为它创建一个包装器:

type HttpWithState() = 
    let cookies = CookieContainer()

    static member RequestString(url, ?params, ?headers, ...) =
        Http.RequestString(url, ?params = params, ?headers = headers, ..., cookieContainer = cookies)

然后像这样使用它:

let http = HttpWithState()
http.RequestString("url1")
http.RequestString("url2")

但是直接使用Http类型

你不会获得那么多

答案 1 :(得分:2)

我不相信你可以从这个类继承 - 这可能是一个设计决定。

但是,该类型的完整路径是

FSharp.Net.Http

所以你可以在

之类的东西中创建自己的类型

A.B.Http

可以调用原始http函数并通过该方法提供覆盖。

答案 2 :(得分:2)

如果不需要访问privates,可以尝试向Http类添加静态扩展方法:

type FSharp.Net.Http with

    static member RequestWithCookies(...) = ...