为什么F#中没有受保护的访问修饰符?

时间:2010-03-05 22:51:56

标签: f#

有没有更好的方法在F#中建模数据以避免需要它?

2 个答案:

答案 0 :(得分:36)

protected修饰符在F#中可能很成问题,因为您经常需要从lambda表达式中调用成员。但是,当您这样做时,您不再从类中访问该方法。当使用在C#中声明的受保护成员时,这也会引起混淆(例如参见this SO question)。如果您可以声明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))

此代码不起作用,因为您从lambda函数(与Test的当前实例不同的对象)调用Test,因此代码不起作用。我认为这是不支持F#中的protected修饰符的主要原因。

在F#中,您通常使用实现继承(即从基类继承)的频率低于C#,因此您不应经常使用protected。相反,通常优选使用接口(在面向对象的F#代码中)和高阶函数(在功能代码中)。但是,很难说如何避免一般protected的需要(除了避免实现继承)。你有一些具体的例子可以激发你的问题吗?

答案 1 :(得分:8)

至于F#是否支持更好的数据建模方式,签名文件允许比C {中internal更精细的可见性决策,这通常非常好。请参阅Brian的评论here以获得更多解释。这与protected的支持(或缺乏支持)无关。