Property
 
Декларирует или определяет свойство в типе или классе

Синтаксис

{ Type | Class } typename
Declare Property fieldname () As datatype
Declare Property fieldname ( [ ByRef | ByVal ] new_value As datatype )
Declare Property fieldname ( [ ByRef | ByVal ] index As datatype ) As datatype
Declare Property fieldname ( [ ByRef | ByVal ] index As datatype, [ ByRef | ByVal ] new_value As datatype )
End { Type | Class }

Property typename.fieldname () As datatype
statements
End Property

Property typename.fieldname ( [ ByRef | ByVal ] new_value As datatype )
statements
End Property

Property typename.fieldname ( [ ByRef | ByVal ] index As datatype ) As datatype
statements
End Property

Property typename.fieldname ( [ ByRef | ByVal ] index As datatype, [ ByRef | ByVal ] new_value As datatype )
statements
End Property

Параметры

typename
имя Type или Class
fieldname
имя свойства
new_value
Значение, передаваемое в свойство, для присваивания
index
значение индекса свойства

Описание

Поля Property используются для получения и установки значения Type или Class таким же образом, как и другие поля данных, за исключением того, что вместо простого присвоения полю или значению, извлеченному из поля, выполняется процедура.

typename - это имя типа, для которого метод Property декларируется или определяется. Правила имени для typename имеют те же правила, как у процедур при использовании в Namespace.

Property может иметь один необязательный параметр индекса. С индексом, свойства доступны как Property(Index) = Value.

Скрытый параметр This имеет тот же тип typename , передаваемый в процедуру свойства. This используется для доступа к полям Type или Class.

Пример

Type Vector2D
  As Single x, y
  Declare Operator Cast() As String
  Declare Property Length() As Single
  Declare Property Length( ByVal new_length As Single )
End Type

Operator Vector2D.cast () As String
  Return "(" + Str(x) + ", " + Str(y) + ")"
End Operator

Property Vector2D.Length() As Single
  Length = Sqr( x * x + y * y )
End Property

Property Vector2D.Length( ByVal new_length As Single )
  Dim m As Single = Length
  If m <> 0 Then
    '' new vector = old / length * new_length
    x *= new_length / m
    y *= new_length / m
  End If
End Property

Dim a As Vector2D = ( 3, 4 )

Print "a = "; a
Print "a.length = "; a.length
Print

a.length = 10

Print "a = "; a
Print "a.length = "; a.length

Вывод:
a = (3, 4)
a.length =  5

a = (6, 8)
a.length =  10
Свойства с индексом:
  '' True/False
Namespace BOOL
  Const FALSE = 0
  Const TRUE = Not FALSE
End Namespace

Type BitNum
  Num As UInteger
  
    '' Свойства Получение/Установка каждое с индексом.
  Declare Property NumBit( ByVal Index As Integer ) As Integer
  Declare Property NumBit( ByVal Index As Integer, ByVal Value As Byte )
End Type

  '' Получить бит по его индексу.
Property BitNum.NumBit( ByVal Index As Integer ) As Integer
  Return Bit( This.Num, Index )
End Property

  '' Установить бит по его индексу.
Property BitNum.NumBit( ByVal Index As Integer, ByVal Value As Byte )

    '' Убедимся, что индекс находится в диапазоне Integer.
  If Index >= ( SizeOf(This.Num) * 8 ) Then
    Print "Out of uInteger Range!"
    Exit Property
  Else
    If Index < 0 Then Exit Property
  End If
  
  If Value = BOOL.FALSE Then
    This.Num = BitReset( This.Num, Index )
  End If
  
  If Value = BOOL.TRUE Then
    This.Num = BitSet( This.Num, Index )
  End If
  
End Property


Dim As BitNum Foo


Print "Testing property indexing with data types:"
Print "FOO Number's Value: " & Foo.Num

  '' Установим бит в числе, как TRUE.
Foo.NumBit(31) = BOOL.TRUE
Print "Set the 31st bit of FOO"

  '' напечатаем, чтобы увидеть, если наш бит был изменен.
Print "FOO Number's Value: " & Foo.Num
Print "FOO 31st Bit Set? " & Foo.NumBit(31)
Sleep
Print ""

Вывод:
Testing property indexing with data types:
FOO Number's Value: 0
Set the 31st bit of FOO
FOO Number's Value: 2147483648
FOO 31st Bit Set? -1
См. также