Почему в F # нет модификатора защищенного доступа? - PullRequest
38 голосов
/ 06 марта 2010

Есть ли лучший способ моделирования данных в F #, чтобы избежать его необходимости?

Ответы [ 2 ]

37 голосов
/ 06 марта 2010

Модификатор 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 в целом (кроме как избежать наследования реализации). У вас есть конкретный пример, который мотивировал ваш вопрос?

8 голосов
/ 06 марта 2010

Что касается того, допускает ли F # лучший способ моделирования данных, файлы сигнатур позволяют принимать более точные решения о видимости, чем internal в C #, что часто очень хорошо. См. Комментарий Брайана здесь для более подробного объяснения. Однако это не зависит от поддержки (или ее отсутствия) для protected.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...