Control
type Control @abstract =
var obs width : u32 = 0
var obs height : u32 = 0
def measure (w : u32) (h : u32)
obs
поля являются наблюдаемыми, могут оповещать об изменениях своего значения.
type Aligner =
inherit Control
def Control.measure (w : u32) (h : u32) =
...
Aligner
определяет абстрактный метод типа Control
. Переопределить метод в подтипах больше нельзя.
type ListItem =
inherit Control
var obs text = ""
var obs foreground = Vector3@zero
var obs background = Vector3@zero
var obs is_selected = false
let rectangle = Rectangle
color@obs = background@obs
is_visible@obs = is_selected@obs
let text_block = TextBlock
text@obs = text@obs
color@obs = foreground@obs
align_h = AlignH/Center
let aligner = Aligner
items = rectangle
text_block
Модификатор @zero
возвращает обнулённую область памяти.
Конструкторы типов Rectangle
, TextBlock
и Aligner
не принимают аргументов, указанные для полей операции выполняются уже после создания объектов.
rectangle.color
обновляется при каждом изменении значения background
из-за модификатора @obs
.
let aligner = Aligner rectangle text_block
Поле Aligner.items
помечено атрибутом @dst
.
let rectangle = Rectangle.new
let text_block = TextBlock.new
let aligner = Aligner
rectangle
color@obs = background@obs
is_visible@obs = is_selected@obs
text_block
text@obs = text@obs
color@obs = foreground@obs
align_h = AlignH/Center
Мы переместили задание полей объектов в выражение для aligner
.
let aligner = Aligner
Rectangle
color@obs = background@obs
is_visible@obs = is_selected@obs
TextBlock
text@obs = text@obs
color@obs = foreground@obs
align_h = AlignH/Center
Если ссылки на Rectangle
и TextBlock
не нужны, то можно создать объекты на месте.