Относительно объектно-ориентированного программирования F # - PullRequest
5 голосов
/ 31 июля 2009

Существует такая дихотомия в том, как мы можем создавать классы в f #, что меня действительно беспокоит. Я могу создавать классы, используя неявный или явный формат. Но некоторые функции, которые мне нужны, доступны только для использования в неявном формате, а некоторые доступны только для использования в явном формате.

Например:

  1. Я не могу использовать let inline* (или только let) внутри явно определенного класса.

  2. Единственный способ (который я знаю) определить неизменяемые публичные поля (не свойства *) внутри неявно определенного класса - это синтаксис val bla : bla.

    Но здесь есть избыточность. Так как в итоге я получу две копии одинаковых неизменяемых данных, одну закрытую, одну общедоступную (поскольку в неявном режиме параметры конструктора сохраняются на протяжении всего существования класса)

  3. (Не очень актуально) Необходимость использования атрибутов для перегрузки метода и для значений по умолчанию для поля довольно неуместна.

Можно ли как-нибудь обойти это?

* Из соображений производительности

РЕДАКТИРОВАТЬ: Оказывается, я не прав в обоих пунктах (спасибо Ганеш Sittampalam & MichaelGG).

  1. Хотя я не могу использовать let inline как в неявном, так и в явном определении класса, я могу использовать member inline очень хорошо, что, я полагаю, делает то же самое.

  2. Очевидно, что в последней версии F # больше нет избыточности, поскольку все параметры, не используемые в теле класса, являются локальными для конструктора.

  3. Уйдет в следующем выпуске F #.

Ответы [ 2 ]

5 голосов
/ 05 августа 2009

Это может не помочь, но вы можете сделать членов встроенными. "member inline private" работает нормально.

1 голос
/ 31 июля 2009

Для let inline вы можете обойти это, переместив его за пределы класса и явно передавая любые значения изнутри области видимости класса при вызове. Поскольку он будет встроен, за это не будет снижаться производительность.

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