Модификатор protected
может быть довольно проблематичным в F #, потому что вам часто нужно вызывать члены из лямбда-выражения. Однако когда вы делаете это, вы больше не обращаетесь к методу из класса. Это также вызывает путаницу при использовании защищенных членов, объявленных в 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))
Этот код не будет работать, потому что вы вызываете Test
из лямбда-функции (которая отличается от текущего экземпляра Test
), поэтому код не будет работать. Я думаю, что это основная причина не поддерживать модификатор protected
в F #.
В F # вы обычно используете наследование реализации (то есть наследование от базового класса) гораздо реже, чем в C #, поэтому вам не нужно protected
так часто. Вместо этого обычно предпочитают использовать интерфейсы (в объектно-ориентированном коде F #) и функции более высокого порядка (в функциональном коде). Тем не менее, сложно сказать, как избежать необходимости protected
в целом (кроме как избежать наследования реализации). У вас есть конкретный пример, который мотивировал ваш вопрос?