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

FreeBASIC OpCast

目次→言語リファレンス→変数とデータ型→演算子一覧Operator CAST←オリジナル・サイト

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

←リンク元に戻る プログラム開発関連に戻る

UDF(ユーザー定義型)の変数を、指定されたデータ型に変換する演算子

構文:
{ Type | Class | Union } typename
declare operator cast () [ byref ] as datatype
...
End { Type | Class | Union }

operator typename.cast () [ byref ] as datatype [ Export ]
...

用法:
Cast( datatype, expression )

パラメタ:
typename
Type か, Class か, Union の名前
datatype
変換先の型の名前で、組込みデータ型(標準的なデータ型)か、typename と異なる UDT 型
expression
変換する式、typename のインスタンス

記述:
expression (typename 変数) を、異なる datatype に変えます。

Cast operator は、Type や, Class や, Union 内で宣言しなければなりません。
すべての非静的メンバー手続きとしては、隠された this パラメータを渡します。

Cast operator は、戻り値の型だけが異なる場合、複数回宣言することができる、唯一の演算子(または関数)です。しかし、中で宣言される、Type や, Class や, Union と同じではありません。

Cast operator は、構築(初期化子付きで)と代入の、式の右側に使える変換を可能にします。(下記の例 1を参照)
その明示的なフォームの用法 Cast( datatype, expression ) に加えて、Cast operator は、datatype への黙示的な変換ができます。(同じ下記の例 1を参照)
この明示的でない使用法では、コンパイラは、オブジェクトの使われ方に基づいて、どの多重定義キャストを呼ぶかを決定します。(例えば、Print 予約語で、コンパイラは、定義されていれば、Cast() As String 演算子を呼び出します)

注意: 多重定義された Cast operator は、UDT インスタンス(組込み型変数でない)だけを変換できます。 それは、多重定義できるのが、メンバー operator(グローバル演算子としてではない)としてだけだからです。
組込み型変数を、UDT(動かない構文: Cast( UDT, built_in_type_variable ))に変換するために、UDT への最善の方法は、構築子や Let 演算子を定めることです。あるいは、参照戻しでなく Cast operator を使うことです。 (by an assignment: Cast( built_in_datatype, UDT_instance ) = built_in_type_variable).
(下記の例 2 参照)

1つの UDT からもう一つの UDT への黙示的な変換のために、最初の UDT の Cast operator は、第2の UDT で、(第2の優先順位で)構築子と Let 演算子を置き換えることができます。(下記の例 3例 4 参照)

警告: 値(ByRef でなく)で返す Cast 演算子では、expressiontypename のインスタンスの場合、一般的に Return expression (あるいは Operator = expression) などの終了コードを使わないでください。
このような Cast 演算子コードは、typename から datatype への暗黙的な変換が、datatype のため、合致する構築子(または Let 演算子)を介して、すでに存在しない限り、呼び出されたときに無限ループを誘発します。 優先度が高いからです。
(下記の例 5 参照)

例 1:
Cast 演算子を用いた変換能力(明示と黙示)を示す、非常に単純な構文の例:
Type UDT
  Dim As Integer I
  Declare Operator Cast () As Integer
  Declare Operator Cast () As String
End Type

Operator UDT.Cast () As Integer
  Print "UDT.Cast() As Integer",
  Return This.I
End Operator

Operator UDT.Cast () As String
  Print "UDT.Cast() As String",
  Return Str(This.I)
End Operator


Dim As UDT u

u.I = 12
Print Cast(Integer, u)               '' 定義済み "Cast() As Integer" 演算子を使った明示的な変換
Print Cast(String, u)                '' 定義済み "Cast() As String" 演算子を使った明示的な変換
Print u                              '' 定義済み "Cast() As String" 演算子を使った、コンパイラによる黙示的な変換
Print

u.I = 34
Dim As Integer J = Cast(Integer, u)  '' 定義済み "Cast() As Integer" 演算子を使った、明示的な初期化による構築
Print J
Dim As Integer K = u                 '' 定義済み "Cast() As Integer" 演算子を用いた、コンパイラによる黙示的な初期化による構築
Print K
Print

u.I = 56
J = Cast(Integer, u)                 '' 定義済み "Cast() As Integer" 演算子を用いた明示的な代入
Print J
K = u                                '' 定義済み "Cast() As Integer" 演算子を用いた、コンパイラによる黙示的な代入
Print K
Print

u.I = 78
Dim As String S = Cast(String, u)    '' 定義済み "Cast() As String" 演算子を用いた明示的な初期化による構築
Print S
Dim As String G = u                  '' 定義済み "Cast() As String" 演算子を用いた、コンパイラによる黙示的な初期化による構築
Print G
Print

u.I = 90
S = Cast(String, u)                  '' 定義済みの "Cast() As String" 演算子を用いた明示的な代入
Print S
G = u                                '' 定義済み "Cast() As String" 演算子を用いた、コンパイラによる黙示的な代入
Print G
Print

Sleep

例 2:
動作しない構文の回避策: UDT_instance = Cast( UDT, built_in_type_variable ):
(構築子、Let 演算子、および参照戻しの Cast 演算子を使う)
Type UDT
  As Integer I
  Declare Constructor ()
  Declare Constructor (ByVal I0 As Integer)
  Declare Operator Let (ByVal I0 As Integer)
  Declare Operator Cast () ByRef As Integer
End Type

Constructor UDT ()
End Constructor

Constructor UDT (ByVal I0 As Integer)
  Print "UDT.Constructor(Byval As Integer)",
  This.I = I0
End Constructor

Operator UDT.Let (ByVal I0 As Integer)
  Print "UDT.Let(Byval As Integer)",,
  This.I = I0
End Operator

Operator UDT.Cast () ByRef As Integer
  Print "UDT.Cast() Byref As Integer",,
  Return This.I
End Operator


Dim As UDT u

'u = Cast(UDT, 12)     '' unsupported - error 20: Type mismatch
u = UDT(34)            '' 定義済み "Constructor(Byval As Integer)" を使う明示的な変換
Print u.I
Print

u = 56                 '' 定義済み "Let(Byval As Integer)" 演算子を用いた、コンパイラによる黙示的な変換
Print u.I
Print

Cast(Integer, u) = 78  '' 定義済みの参照戻し "Cast() Byref As Integer" 演算子を用いた明示的な変換
Print u.I
Print

Sleep

例 3:
UDT1 から UDT2 への変換で、UDT2 の構築子と Let 演算子を使う:
Type _UDT1 As UDT1

Type UDT2
  Dim As Integer I2
  Declare Constructor ()
  Declare Constructor (ByRef u As _UDT1)
  Declare Operator Let (ByRef u As _UDT1)
End Type

Constructor UDT2 ()
End Constructor

Type UDT1
  Dim As Integer I1
End Type

Constructor UDT2 (ByRef u As UDT1)
  Print "UDT2.Constructor(Byref As UDT1)",
  This.I2 = u.I1
End Constructor

Operator UDT2.Let (ByRef u As UDT1)
  Print "UDT2.Let(Byref As UDT1)",,
  This.I2 = u.I1
End Operator


Dim As UDT1 u1

u1.I1 = 123
Dim As UDT2 u2 = u1  '' 定義済み "UDT2.Constructor(Byref As UDT1)" を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print

u1.I1 = 456
u2 = u1              '' 定義済み "UDT2.Let(Byref As UDT1)" 演算子を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print

Sleep

例 4:
UDT1 から UDT2 に、UDT1 の Cast 演算子を使って変換:
Type UDT2
  Dim As Integer I2
End Type

Type UDT1
  Dim As Integer I1
  Declare Operator Cast () As UDT2
End Type

Operator UDT1.Cast () As UDT2
  Print "UDT1.Cast() As UDT2",,
  Dim As UDT2 u
  u.I2 = This.I1
  Return u
End Operator


Dim As UDT1 u1

u1.I1 = 123
Dim As UDT2 u2 = u1  '' 定義済み "UDT1.Cast() As UDT2" 演算子を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print

u1.I1 = 456
u2 = u1              '' 定義済み "UDT1.Cast() As UDT2" 演算子を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print

Sleep

例 5:
UDT1 から UDT2 への変換。 UDT1 で、存在している Return This による Cast 演算子を使う。UDT2 の合致する Let 演算子のおかげで、無限ループはない。
Type _UDT1 As UDT1

Type UDT2
  Dim As Integer I2
  Declare Operator Let (ByRef u As _UDT1)
End Type

Type UDT1
  Dim As Integer I1
  Declare Operator Cast () As UDT2
End Type

Operator UDT1.Cast () As UDT2
  Print "UDT1.Cast() As UDT2"
  Return This                       '' 定義済み "UDT2.Let(Byref As UDT1)" 演算子を用いた、コンパイラによる黙示的な変換
End Operator

Operator UDT2.Let (ByRef u As UDT1)
  Print "UDT2.Let(Byref As UDT1)"
  This.I2 = u.I1
End Operator


Dim As UDT1 u1
u1.I1 = 123

Print Cast(UDT2, u1).I2

Sleep

方言差:
QBからの違い:
参照:

演算子一覧 に戻る

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-09-18 04:10:43
日本語翻訳:WATANABE Makoto、原文著作者:fxm

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

表示-非営利-継承