Учебники

F # — Классы

Классы — это типы, которые представляют объекты, которые могут иметь свойства, методы и события. «Они используются для моделирования действий, процессов и любых концептуальных объектов в приложениях».

Синтаксис

Синтаксис для определения типа класса выглядит следующим образом:

// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] =
   [ class ]
      [ inherit base-type-name(base-constructor-args) ]
      [ let-bindings ]
      [ do-bindings ]
      member-list
      ...
   [ end ]

// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...

Куда,

  • Имя типа — это любой допустимый идентификатор. Модификатор доступа по умолчанию для этого является публичным .

  • Тип-параметры описывают необязательные параметры универсального типа.

  • Список параметров описывает параметры конструктора. Модификатор доступа по умолчанию для основного конструктора — public .

  • Идентификатор, используемый с необязательным ключевым словом as, задает имя переменной экземпляра или самоидентификатор, который можно использовать в определении типа для ссылки на экземпляр типа.

  • Ключевое слово наследия позволяет вам указать базовый класс для класса.

  • Привязки let позволяют объявлять поля или значения функций, локальные для класса.

  • Раздел do-bindings содержит код, который должен быть выполнен при построении объекта.

  • Список членов состоит из дополнительных конструкторов, объявлений экземпляра и статического метода, объявлений интерфейса, абстрактных привязок, а также объявлений свойств и событий.

  • Ключевые слова class и end , обозначающие начало и конец определения, являются необязательными.

Имя типа — это любой допустимый идентификатор. Модификатор доступа по умолчанию для этого является публичным .

Тип-параметры описывают необязательные параметры универсального типа.

Список параметров описывает параметры конструктора. Модификатор доступа по умолчанию для основного конструктора — public .

Идентификатор, используемый с необязательным ключевым словом as, задает имя переменной экземпляра или самоидентификатор, который можно использовать в определении типа для ссылки на экземпляр типа.

Ключевое слово наследия позволяет вам указать базовый класс для класса.

Привязки let позволяют объявлять поля или значения функций, локальные для класса.

Раздел do-bindings содержит код, который должен быть выполнен при построении объекта.

Список членов состоит из дополнительных конструкторов, объявлений экземпляра и статического метода, объявлений интерфейса, абстрактных привязок, а также объявлений свойств и событий.

Ключевые слова class и end , обозначающие начало и конец определения, являются необязательными.

Конструктор класса

Конструктор — это код, который создает экземпляр типа класса.

В F # конструкторы работают немного иначе, чем другие языки .Net. В определении класса аргументы первичного конструктора описываются как список параметров.

Тело конструктора состоит из привязок let и do .

Вы можете добавить дополнительные конструкторы, используя новое ключевое слово для добавления члена —

new (argument-list) = constructor-body

Следующий пример иллюстрирует концепцию —

пример

Следующая программа создает класс строки вместе с конструктором, который вычисляет длину строки при создании объекта класса —

Live Demo

type Line = class
   val X1 : float
   val Y1 : float
   val X2 : float
   val Y2 : float

   new (x1, y1, x2, y2) as this =
      { X1 = x1; Y1 = y1; X2 = x2; Y2 = y2;}
      then
         printfn " Creating Line: {(%g, %g), (%g, %g)}\nLength: %g"
            this.X1 this.Y1 this.X2 this.Y2 this.Length

   member x.Length =
      let sqr x = x * x
      sqrt(sqr(x.X1 - x.X2) + sqr(x.Y1 - x.Y2) )
end
let aLine = new Line(1.0, 1.0, 4.0, 5.0)

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

Creating Line: {(1, 1), (4, 5)}
Length: 5

Пусть привязки

Привязки let в определении класса позволяют вам определять частные поля и частные функции для классов F #.

Live Demo

type Greetings(name) as gr =
   let data = name
   do
      gr.PrintMessage()
   member this.PrintMessage() =
      printf "Hello %s\n" data
let gtr = new Greetings("Zara")

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

Hello Zara

Обратите внимание на использование самоидентификатора gr для класса Greetings .