Skip to content

EXTENDS ZSTRING


指定继承 Zstring 行为的类型

语法

vb
Type|Union typename Extends Zstring [, base_typename]

...

End Type|Union

说明

Extends Zstring 声明 typename 继承 Zstring 的属性和行为。其目的是允许用户创建自定义字符串类型(例如,具有动态内存管理),使其能够很好地融入现有的 fbc 编译器内置功能(与 fbc 的 Zstring 类型具有良好的互操作性)。

带有合适 Cast 运算符的此类 UDT 声明将指示编译器将该 UDT 转换为 Zstring(此外,还可以声明其他合适的运算符,如 Let[](指针索引)Len 等)。

Zstring 行为可以直接继承,也可以从基类型间接地单一继承。

Zstring 行为也可以由同时扩展 base_typename 的 UDT 继承(一种伪多重继承)。

通过将类型(直接或间接)声明为 Extends Zstring(仅需额外定义合适的 Cast 运算符),可使其完全兼容 Zstring 类型,甚至包括 Strptr/SaddLset/RsetSelect Case

示例

start GeSHi

vb
Type myZstring Extends ZString
  Public:
    Declare Constructor (ByRef z As Const ZString = "")
    Declare Operator Cast () ByRef As Const ZString
    Declare Operator Let (ByRef z As Const ZString)
  Private:
    Dim As String s
End Type

Constructor myZstring (ByRef z As Const ZString = "")
  This.s = z
End Constructor

Operator myZstring.Cast () ByRef As Const ZString
  Return *StrPtr(This.s)
End Operator

Operator myZstring.Let (ByRef z As Const ZString)
  This.s = z
End Operator

Dim As myZstring z = "FreeBASIC"
Print "'" & z & "'"

z &= " compiler"
Print "'" & z & "'"

Sleep

end GeSHi

start GeSHi

vb
Type vZstring Extends ZString
  Public:
    Declare Constructor (ByVal pz As Const ZString Ptr = 0)
    Declare Operator Cast () ByRef As ZString
    Declare Operator Let (ByVal pz As Const ZString Ptr)
    Declare Operator [] (ByVal index As Integer) ByRef As UByte
    Declare Destructor ()
  Private:
    Dim As ZString Ptr p
    Dim As UInteger l
End Type

Constructor vZstring (ByVal pz As Const ZString Ptr = 0)
  This.l = Len(*pz)
  This.p = CAllocate(This.l + 1, SizeOf(ZString))
  *This.p = *pz
End Constructor

Operator vZstring.Cast () ByRef As ZString
  Return *This.p
End Operator

Operator vZstring.Let (ByVal pz As Const ZString Ptr)
  If This.l < Len(*pz) Then
    Deallocate(This.p)
    This.l = Len(*pz)
    This.p = CAllocate(This.l + 1, SizeOf(ZString))
  End If
  *This.p = *pz
End Operator

Operator vZstring.[] (ByVal index As Integer) ByRef As UByte
  Return This.p[index]
End Operator

Destructor vZstring ()
  Deallocate(This.p)
End Destructor

Operator Len (ByRef v As vZstring) As Integer
  Return Len(Type<String>(v))        '' found nothing better than this
End Operator                         ''     (or: 'Return Len(Str(v))')

Dim As vZstring v = "FreeBASIC"
Print "'" & v & "'", Len(v)

Dim As ZString * 256 z
z = *StrPtr(v)                       '' 'error 24: Invalid data types' without 'Extends Zstring'
Print "'" & z & "'", Len(z)

v &= Space(2)
Print "'" & v & "'", Len(v)
RSet v, "FreeBASIC"                  '' 'error 24: Invalid data types' without 'Extends Zstring'
Print "'" & v & "'", Len(v)          ''     ('Cast' must return a modifiable reference)

Select Case v                        '' 'error 24: Invalid data types' without 'Extends Zstring'
Case Type<vZstring>(Trim(v) & "  ")
  Print "Left justified"
Case Type<vZstring>("  " & Trim(v))
  Print "Right justified"
End Select

v[0] = Asc("-")
Print "'" & v & "'", Len(v)

Print "'" & Right(v, 5) & "'"        '' since fbc 1.09.0, 'Right' supports types with 'Extends Zstring'
'Print "'" & Right(Str(v), 5) & "'"  '' before fbc 1.09.0, use this workaround (or: 'Right(Type<String>(v), 5)')

Sleep

end GeSHi

版本

  • 在 fbc 1.09.0 之前,此提升尚未完全兼容内置函数 Val/Valint/Vallng/Valuint/Valunlg 以及 Left/RightZstring 类型。
  • 自 fbc 1.07.0 起可用

方言差异

  • -lang qb 方言中不可用,除非使用别名 __Extends __Zstring 引用,但由于该方言不允许成员过程,实际无法使用。

与 QB 的区别

  • FreeBASIC 新增

另请参阅

  • Type
  • Union
  • Extends
  • Zstring
  • Extends Wstring

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系