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 ...
...
Где,
В type-nameлюбой допустимый идентификатор. Модификатор доступа по умолчанию для этого:public.
В type-params описывает необязательные параметры универсального типа.
В parameter-listописывает параметры конструктора. Модификатор доступа по умолчанию для основного конструктора:public.
В identifier используется с необязательным as ключевое слово дает имя переменной экземпляра, или self-identifier, который можно использовать в определении типа для ссылки на экземпляр типа.
В inherit ключевое слово позволяет указать базовый класс для класса.
В let привязки позволяют объявлять поля или значения функций, локальные для класса.
В do-bindings Раздел включает код, который будет выполняться при построении объекта.
В member-list состоит из дополнительных конструкторов, объявлений экземпляров и статических методов, объявлений интерфейсов, абстрактных привязок и объявлений свойств и событий.
Ключевые слова class и end обозначающие начало и конец определения не являются обязательными.
Конструктор класса
Конструктор - это код, который создает экземпляр типа класса.
В F # конструкторы работают немного иначе, чем в других языках .Net. В определении класса аргументы основного конструктора описываются как список параметров.
Тело конструктора состоит из let и do привязки.
Вы можете добавить дополнительные конструкторы, используя ключевое слово new для добавления члена -
new (argument-list) = constructor-body
Следующий пример иллюстрирует концепцию -
пример
Следующая программа создает класс линии вместе с конструктором, который вычисляет длину линии при создании объекта класса:
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 #.
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 .