Class & Enum
Class や Enum を定義することができます
Class
クラス構文を使用することができる。PowerShell V5以降。
Class構文、Enumの宣言、プロパティ、メソッド、継承等ができます。
クラスの定義
以下のように定義する。
PS> class Country {
[string]$name
[string]$language
}
インスタンスを生成する
New-Object CLASS-NAME
でインスタンスを生成できる。
v5以降、[CLASS-NAME]::new()
でもインスタンスを生成できます。v5以降はこちらオススメ。
PS> New-Object Country
name language
---- --------
PS> [Country]::new()
name language
---- --------
プロパティの初期値を設定する
PS> class Country {
>> [string]$name="NAME"
>> [string]$language="LANGUAGE"
>> }
PS> [Country]::new()
name language
---- --------
NAME LANGUAGE
プロパティの値を指定して、インスタンスを作成する
PS> [Country]@{name="AAA"; language="BBB"}
name language
---- --------
AAA BBB
static & hidden
PS> class mynum {
>> static $number1 = 100 # static
>> hidden static $number2 = 200 # hidden
>> }
PS> [mynum]::number1
100
PS> [mynum]::number2
200
PS> [mynum] | Get-Member -Type Property -Static
TypeName: mynum
Name MemberType Definition
---- ---------- ----------
number1 Property static System.Object number1 {get;set;}
PS> [mynum] | Get-Member -Type Property -Static -Force
TypeName: mynum
Name MemberType Definition
---- ---------- ----------
number1 Property static System.Object number1 {get;set;}
number2 Property static System.Object number2 {get;set;}
コンストラクター
class Country {
[string]$name
[string]$language
# Constructor
Country([string]$name, [string]$language) {
$this.name = $name
$this.language = $language
}
}
PS> $country = [Country]::new('Japan','Japanese')
PS> $country
name language
---- --------
Japan Japanese
複数のコンストラクター
PS> class Country {
>> [string]$name
>> [string]$language
>>
>> Country() {
>> }
>>
>> Country([string]$name, [string]$language) {
>> $this.name = $name
>> $this.language = $language
>> }
>> }
PS> $country = [Country]::new()
PS> $japan = [Country]::new('Japan','Japanese')
PS> $country
name language
---- --------
PS> $japan
name language
---- --------
Japan Japanese
メソッド
PS /Users/miajimyu/Desktop> class Country {
>> [string]$name
>> [string]$language
>>
>> [void] GetProperty() {
>> Write-Host "name`t`t:" $this.name
>> Write-Host "language`t:" $this.language
>> }
>> }
PS /Users/miajimyu/Desktop> $country = [Country]::new()
PS /Users/miajimyu/Desktop> $country.GetProperty()
name :
language :
PS /Users/miajimyu/Desktop> $country.name = 'japan'
PS /Users/miajimyu/Desktop> $country.language = 'japanese'
PS /Users/miajimyu/Desktop> $country.GetProperty()
name : japan
language : japanese
例
# Country.ps1
class Country {
[string]$name
[string]$language
Country() {
}
Country([string]$name, [string]$language) {
$this.name = $name
$this.language = $language
}
[void] GetProperty() {
Write-Host "name`t`t:" $this.name
Write-Host "language`t:" $this.language
}
}
class USA : Country {
USA() {
$this.name = "United States of America"
$this.language = "English"
}
}
class Japan : Country {
Japan() {
$this.name = "Japan"
$this.language = "Japanese"
}
[void] GetProperty() {
Write-Host "名前`t`t:" $this.name
Write-Host "言語`t`t:" $this.language
}
}
function Main {
$usa = [USA]::new()
$usa.GetProperty()
$japan = [Japan]::new()
$japan.GetProperty()
}
Main
PS> .\Country.ps1
name : United States of America
language : English
名前 : Japan
言語 : Japanese
Enum
enumの定義の方法。
enum Colors {
Red
Blue = 10 # 値を設定することも可能
Green
}
アクセス方法と値の確認方法
# アクセス方法
PS> [Colors]::Red
Red
PS> [Colors] 0
Red
PS> [Colors] "Red"
Red
# 値の確認
PS> [Colors]::Red.value__
0
PS> [int][Colors]::Red # [int]でキャストしても値が見られる
0
PS> [Colors]::Blue.value__
10
PS> [Colors]::Green.value__
11
Enumをswitchステートメントと組み合わせる例
例1
# GetRGB.ps1
enum Colors {
Red
Blue
Green
}
foreach ($item in $args) {
switch ($item) {
Red {"R"}
Blue {"B"}
Green {"G"}
Default {"Unknown"}
}
}
実行結果
PS> .\GetRGB.ps1 green red blue pink
G
R
B
Unknown
例2
[$Colors]
の指定をすると、実行時エラーになります。
# GetRGB.ps1
enum Colors {
Red
Blue
Green
}
foreach ($item in $args) {
switch ([Colors]$item) { # [Colors]を追加
Red {"R"}
Blue {"B"}
Green {"G"}
Default {"Unknown"}
}
}
実行結果
PS /Users/user/Desktop> .\GetRGB.ps1 green red blue pink
InvalidArgument: /Users/user/Desktop/GetRGB.ps1:7:9
Line |
7 | switch ([Colors]$args) {
| ~~~~~~~~~~~~~
| Cannot convert value "green,red,blue,pink" to type "Colors". Error: "Unable to match the identifier name green,red,blue,pink to a valid
| enumerator name. Specify one of the following enumerator names and try again: Red, Blue, Green"
flags()
[flags()]
をつけると、bitの演算もできます。
PS> [flags()] enum mybit {zero = 0x01; one = 0x02; two = 0x04; three = 0x08}
PS> [int][mybit] "one,two"
6
PS> [int][mybit] "zero,one,two,three"
15
YouTube
動画による説明はこちら。
参考資料
About Classes | Microsoft Docs
スポンサーリンク