有没有更好的方法在F#中建模数据以避免需要它?
答案 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
的支持(或缺乏支持)无关。