FreeBASIC マニュアルのトップに戻る

FreeBASIC EXTENDS ZSTRING

目次→言語リファレンス→変数とデータ型→ユーザ定義型EXTENDS ZSTRING←オリジナル・サイト

EXTENDS ZSTRING 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


Zstring の動作を継承する型を指定します。

構文:
Type|Union typename Extends Zstring [, base_typename]
...
End Type|Union

内容:
Extends Zstring は、typename を宣言して、Zstring のプロパティと動作を、継承します。
目的は、ユーザーが、既存の fbc コンパイラの組み込みに、うまく統合できる、カスタム文字列型を作成(つまり、動的メモリ管理を使う)できるようにすることです。(fbc の Zstring 型との良好な相互運用性)

このような適切な Cast 演算子を使った UDT の宣言は、UDTを Zstring に変換するように、コンパイラーに指示します。
(さらに、Let, [] (Pointer index), Len, ...などの、他の適切な演算子も宣言できます)

Zstring の動作は、直接や間接に、あるいは単独で、ベース型から継承できます。
Zstring の動作は、base_typename を拡張する UDT によっても継承できます。(疑似多重継承の一種)

(直接、間接を問わず)型を Extends Zstring として宣言することにより(加えて適切な Cast 演算子だけを定義することで)、Strptr/Sadd, Lset/Rset, および Select Case を使っても、完全に Zstring 型と互換性があります。

例:
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

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) & "'"      '' fbc 1.09.0 〜「Right」は「ExtendsZstring」型をサポートします!
Print "'" & Right(Str(v), 5) & "'"  '' fbc 1.09.0 より前は、この回避策を使ってください(または: 'Right(Type<String>(v), 5)')

Sleep


バージョン:
方言差:
QBからの違い:
参照:
ユーザ定義型 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2021-12-02 04:21:39
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承