是否有更好的方法在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/

10-14 04:36