是否有更好的方法在F#中建模数据以避免需要它?
最佳答案
在F#中,protected
修饰符可能会引起很多问题,因为您经常需要从lambda表达式中调用成员。但是,这样做时,您不再从类内部访问该方法。当使用在C#中声明的 protected 成员时,这也会引起困惑(例如,参见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
。相反,通常首选使用接口(interface)(在面向对象的F#代码中)和高阶函数(在功能代码中)。但是,很难说一般如何避免使用protected
(除了避免实现继承之外)。您是否有一些激发问题的具体例子?关于f# - 为什么F#中没有 protected 访问修饰符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2390515/