トッカンソフトウェア

PowerShell クラス

PowerShellのクラスを使ってみます

クラス

クラスを定義するには class クラス名{} の形で定義します。
				
#クラスサンプル
class Test {

	#プロパティ
	[string] $str1
	[string] $str2

	#コンストラクタ
	Test([string]$_str1) {
		$this.str1 = $_str1
	}
					
	#Get
	[string] getStr() {
		return $this.str1 + $this.str2
	}
					
	#Set
	setStr2([string]$_str2) {
		$this.str2 = $_str2
	}
					
}

#オブジェクト生成(古い、遅い)
$testA = New-Object Test("Hello")
$testA.str2 = "World"
write-host  $testA.getStr()
					
#オブジェクト生成(こちらを使うべき)
$testB = [Test]::new("abc")
$testB.setStr2("def")
write-host  $testB.getStr()

			
実行結果
				
HelloWorld
abcdef
	
			
クラスからオブジェクトを生成するには、New-Object クラス名 か、[クラス名]::new を実行します。
						
$testA = New-Object Test("Hello")
$testB = [Test]::new("abc")
	
			

リストのコンストラクタ


#クラスサンプル
class Test {

	#プロパティ
	[Object[]] $objs

	#コンストラクタ
	Test([Object[]] $objs) {
		$this.objs = $objs
	}
					
	#Get
	[string] getStr([int]$i) {
		return $this.objs[$i]
	}					
}

$ary = @("aaa","bbb")

#オブジェクト生成
$testB = [Test]::new($ary)
write-host  $testB.getStr(1)

#bbbが出力

#オブジェクト生成
$testA = New-Object Test($ary)

#New-Object : "Test" のオーバーロードで、引数の数が "2" であるものが見つかりません。 が発生

コンストラクタにリストを渡す場合、New-Objectでオブジェクトを作成するとエラーになります。::newで作成するとエラーになりません。
理由はわかりません。

クラス内のメソッド呼び出し


#クラスサンプル
class Test {

					
	[string] getStr($arg) {

		$str = $this.addStr($arg)
		return $str 
	}
					
	[string] addStr($arg) {
		return "Hello" + $arg
	}
					
}
					
#オブジェクト生成
$testB = [Test]::new()
write-host  $testB.getStr("World")

#HelloWorldが出力
			
クラス内のメソッドの呼び出しでは頭に$thisを付けます。

クラス外の変数アクセス、メソッド呼び出し


#クラスサンプル
class Test {

	[void]showClass([int]$i) {
        #write-host ("showClass1:" + $ary[$i]) #エラー
        write-host ("showClass:2:" + $script:ary[$i])

        showFunc($i)
	}					
}

function showFunc([int]$i){
        write-host ("showFunc1:" + $ary[$i])
        write-host ("showFunc2:" + $script:ary[$i])
}

$ary = @("aaa","bbb")

#オブジェクト生成
$testA = [Test]::new()
$testA.showClass(1)

出力

showClass:2:bbb
showFunc1:bbb
showFunc2:bbb

クラス外の変数やオブジェクトにアクセスするには、$script:を付けてアクセスします。
functionの場合、$script:を付けなくても良いのにクラスのメソッドでは駄目な理由はわかりません。

クラス外のfunctionは普通にアクセスできます。

Static


class Test {

    # 変数
    static [string] $msg

    # コンストラクタ
    static Test() {
        [Test]::msg = "Hello World"
    }

    # メソッド
    static show() {
        Write-Host ([Test]::msg)
    }
}

[Test]::show()

出力

Hello World

静的メソッド・静的変数はstaticを付けます。
アクセスするときは、[クラス]::を頭に付けます

ページのトップへ戻る