Static (Member)
 
Декларирует статическую процедуру-элемент

Синтаксис

Type typename
Declare Static Sub|Function procname ...
End Type

Static Sub|Function typename.procname ...
...
End Sub|Function

Описание

Static методы не имеют неявный экземпляр аргумента This , передаваемый ей. Это позволяет их использовать как обычные процедуры, не являющихся элементами (например с указателями на процедуру обратного вызова), с той разницей, что они заключены в пространство typename  и имеют доступ к элементам typename Private или Protected.

Static методы могут быть вызваны непосредственно в любом месте кода, как обычные процедуры, не являющиеся элементами типа typename, похожи на не-Static методы, однако в любом случае нет явного или неявного This (или явного Base) .

Для процедур-элементов с Static в своей декларации, Static также может быть указан на соответствующие определения процедур, для улучшения читабельности кода.

Пример

'' Пример, показывающий, как фактическая процедура ссылается на элемент и может быть установлена во время выполнения.
'' Использование статических процедур-элементов.
Type _Object

  Enum handlertype
    ht_default
    ht_A
    ht_B
  End Enum

  Declare Constructor( ByVal ht As handlertype = ht_default)

  Declare Sub handler()

Private:
  Declare Static Sub handler_default( ByRef obj As _Object )
  Declare Static Sub handler_A( ByRef obj As _Object )
  Declare Static Sub handler_B( ByRef obj As _Object )
  handler_func As Sub( ByRef obj As _Object )

End Type

Constructor _Object( ByVal ht As handlertype )
  Select Case ht
  Case ht_A
    handler_func = @_Object.handler_A
  Case ht_B
    handler_func = @_Object.handler_B
  Case Else
    handler_func = @_Object.handler_default
  End Select
End Constructor

Sub _Object.handler()
  handler_func(This)
End Sub

Sub _Object.handler_default( ByRef obj As _Object )
  Print "Handling using default method"
End Sub

Sub _Object.handler_A( ByRef obj As _Object )
  Print "Handling using method A"
End Sub

Sub _Object.handler_B( ByRef obj As _Object )
  Print "Handling using method B"
End Sub

Dim objects(1 To 4) As _Object => _
  { _
    _Object.handlertype.ht_B, _
    _Object.handlertype.ht_default, _
    _Object.handlertype.ht_A _
  }
  '' 4-й пункт массива будет _Object.handlertype.ht_default

For i As Integer = 1 To 4
  Print i,
  objects(i).handler()
Next i


Отличия от QB

  • Новое в FreeBASIC

См. также