Tom*_*cek 38
该protected修改可以在F#很成问题,因为你经常需要从lambda表达式调用成员.但是,当您这样做时,您不再从类中访问该方法.当使用在C#中声明的受保护成员时,这也会引起混淆(例如参见此SO问题).如果您可以声明protected成员,则以下代码可能会令人惊讶:
type Base() =
protected member x.Test(a) = a > 10
type Inherited() =
inherit Base()
member x.Filter(list) =
list |> List.filter (fun a -> x.Test(a))
Run Code Online (Sandbox Code Playgroud)
这段代码不起作用,因为你是Test从lambda函数调用的(这是一个与当前实例不同的对象Test),所以代码不起作用.我认为这是protected在F#中不支持修饰符的主要原因.
在F#中,您通常使用实现继承(即从基类继承)的频率低于C#,因此您不需要protected经常使用.相反,通常优选使用接口(在面向对象的F#代码中)和高阶函数(在功能代码中).但是,很难说如何避免protected一般的需要(除了避免实现继承).你有一些具体的例子可以激发你的问题吗?