列挙(Enumeration)、いくつかの、名前付き
定数 で構成される、特別なユーザー定義型。
構文
Enum [typename [ Explicit ] ]
symbolname [= expression] [, ...]
...
End Enum
パラメータ
typename
Enum の名前
symbolname
定数の名前
expression
定数の式
Explicit
typename.symbolname によって、シンボルを明示的に参照する必要があることを要求します。
内容
列挙は、ユーザー定義型で、名前付き整数定数のセットで構成されます。
列挙は、特に状態が自然に進行する場合に、シーケンスと状態を定義するのに役立ちます。
列挙は、シンボルを介して名前付き定数として表される、値の範囲を記述する文脈を提供します。
名前空間とは異なり、列挙は任意のスコープ・ブロックで定義することができて、そのシンボルは、列挙が宣言されているスコープ範囲でのみ有効です。
列挙型は、シンボリックなので、保守しやすいコードに役立ちます。明示的な名前を使って、整数値を操作できます。
列挙は値の型です。
つまり、列挙には独自の値が含まれ、継承したり継承されたりすることはできません。
Enum には、メンバー手続きやメンバー・データ(シンボルのみ)を含めることはできません。しかし、持つことで Type に含めることができます(名前付きも名前なしも)。
用法
列挙内のすべてのシンボルには、列挙内の値の順序で、その場所に対応する整数値(正または負)が、黙示的に割り当てられます。
すべてのシンボルは、定数として扱われます。
デフォルトでは、最初の値には 0 が割り当てられ、次の値には 1 が割り当てられます。
ただし、任意のシンボルの値を、明示的に設定できます(次のシンボルは、前の値に 1 を加えた値に黙示的に設定されます)。
シンボルに与えられる値は、一意である必要はありません。
列挙が
Explicit として修飾されている場合、すべての
symbolname へのアクセスには、常に
typename のプレフィックスが必要です。
プレフィックスは、他のエンティティとのあいまいさを解決するためにも、使えます。
Enum インスタンスは、ユーザ定義型インスタンスとして、手続きに渡すことができます(多重定義された演算子の定義を含む)。
Enum インスタンスのサイズは、常に
Integer のサイズになります(定義されたシンボルの数に関係なく、単なるコンパイラー割り当ての宣言です)。
Enum インスタンス(または
Enum シンボル)は、黙示的に整数に変換できます。
注:
-
多くの言語では、整数変数がスコープ付き列挙型インスタンスに暗黙的に変換されることはありません。逆も同様です。
後者は厳密に型指定され(FreeBASIC で Enum qualified as Explicit と同等の宣言)、このような変換には明示的な型変換が必要です 。
- しかし、FreeBASIC はこれを受け入れます(数値が定義されている Enum シンボルと一致しなくても)。これは、通常の Enum 機能に対する FreeBASIC の多くの欠点の1つです。
- そのため、実際の ENUM インスタンス(INTEGER としてのサイズ)を宣言することにはあまり興味がありませんが、そうでなければ、代わりに事前に組み込まれた任意の整数変数を宣言することができます。
- Explicit 修飾子を使わない(名前空間接頭辞を付けない)場合、定数の単純な離散リストと比較して、ENUM 構造を使っても、値の自動増加を除いてあまり意味がありません。
例
簡単な使用例:
Enum Colors
black
blue
green
cyan
red
pink
yellow
grey
dark_grey
bright_blue
bright_green
bright_cyan
bright_red
bright_pink
bright_yellow
white
End Enum
Sub print_fbc (ByVal foreground As Colors, ByVal background As Colors)
Color foreground, background
Print " " & __FB_SIGNATURE__ & " "
End Sub
Dim As Colors std_foreground, std_background
std_foreground = LoWord(Color())
std_background = HiWord(Color())
Dim As Colors my_foreground, my_background
my_foreground = bright_yellow
my_background = cyan
print_fbc(my_foreground, my_background)
Color std_foreground, std_background
Print "end"
Sleep
同じ結果ですが、
Enum インスタンスに数値を割り当てるときに、明示的に型変換するように、
Enum をインターフェイスする
Type を使います(上記の「注意」を参照):
Enum Colors Explicit
black
blue
green
cyan
red
pink
yellow
grey
dark_grey
bright_blue
bright_green
bright_cyan
bright_red
bright_pink
bright_yellow
white
End Enum
Type Console_Colors
Public:
Declare Property foreground () As Colors
Declare Property foreground (ByVal c As Colors)
Declare Property background () As Colors
Declare Property background (ByVal c As Colors)
Private:
Dim As Colors _foreground
Dim As Colors _background
End Type
Property Console_Colors.foreground () As Colors
Return This._foreground
End Property
Property Console_Colors.foreground (ByVal c As Colors)
This._foreground = c
End Property
Property Console_Colors.background () As Colors
Return This._background
End Property
Property Console_Colors.background (ByVal c As Colors)
This._background = c
End Property
Sub print_fbc (ByVal foreground As Colors, ByVal background As Colors)
Color foreground, background
Print " " & __FB_SIGNATURE__ & " "
End Sub
Dim As Console_Colors std_colors
std_colors.foreground = Cast(Colors, LoWord(Color())) '' プロパティ宣言のために明示的なキャストが必須
std_colors.background = Cast(Colors, HiWord(Color())) '' プロパティ宣言のために明示的なキャストが必須
Dim As Console_Colors my_colors
my_colors.foreground = Colors.bright_yellow
my_colors.background = Colors.cyan
print_fbc(my_colors.foreground, my_colors.background)
Color std_colors.foreground, std_colors.background
Print "end"
Sleep
参照