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

About Enum | Microsoft Docs


スポンサーリンク