EXTENDS ZSTRING
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgExtendsZstring
- 最后更新: 2021-12-02
指定继承 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/Sadd、Lset/Rset 和 Select 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 & "'"
Sleepend 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)')
Sleepend GeSHi
版本
- 在 fbc 1.09.0 之前,此提升尚未完全兼容内置函数
Val/Valint/Vallng/Valuint/Valunlg以及Left/Right的Zstring类型。 - 自 fbc 1.07.0 起可用
方言差异
- 在 -lang qb 方言中不可用,除非使用别名
__Extends __Zstring引用,但由于该方言不允许成员过程,实际无法使用。
与 QB 的区别
- FreeBASIC 新增
另请参阅
TypeUnionExtendsZstringExtends Wstring
返回 目录