Home > Windows にまつわる e.t.c.

PowerShell Class 内で別のクラスを使用する


PowerShell でクラスを書いていると、継承ではなく別のクラスをクラスの中で使いたいということがあります。

そのようなときは、こんな感じで書きます。

(文中で、「内部データ/データ」と「プロパティ」の2つの言葉が出てきますが、文脈によって使い分けているだけで同じ意味です)

 

メソッド スコープで使い捨ての場合

メソッドスコープで使い捨てる場合は、普通に class を使うのと変わりません。

[D:\temp\test01.ps1]

# 呼び出すクラス
class TestClassA{
    [int] $Data

    TestClassA([int]$Indata){
        $this.Data = $Indata
    }

    TestClassA(){
        $this.Data = 0
    }

    [int] Add([int]$Indata){
        $this.Data += $Indata
        return $this.Data
    }
}

# TestClassA を使うクラス
class TestClassB{
    [int] hoge([int]$Indata){
        
        #メソッドスコープの使い捨てで TestClassA を使う
        $MethodScopeObject = New-Object TestClassA
        return $MethodLocalObject.Add($Indata)
    }
}

# インスタンス化
$TestObject = New-Object TestClassB

# メソッドを呼び出す
$TestObject.hoge(5)
$TestObject.hoge(5)

 

PS D:\> D:\temp\test01.ps1
5
5
PS D:\>

 

プロパティとして保持する場合

使用するクラスを保持する場合は、使用するクラスをプロパティとして定義します。

クラスをプロパティとして定義する場合は、プロパティにする変数をクラスでキャストします。

[クラス名] $変数名

 

クラス名でキャストしたプロパティは、まだインスタンスを持っていないので、通常のプロパティと同様に $this を使ってコンストラクタでインスタンスを割り当てます。

 

[D:\temp\test02.ps1]

# 呼び出すクラス
class TestClassA{
    [int] $Data

    TestClassA([int]$Indata){
        $this.Data = $Indata
    }

    TestClassA(){
        $this.Data = 0
    }

    [int] Add([int]$Indata){
        $this.Data += $Indata
        return $this.Data
    }
}

# TestClassA を使うクラス
class TestClassB{

    # Class をプロパティ定義する
    [TestClassA] $ClassScopeObject

    # コンストラクタ
    TestClassB(){
        # プロパティにインスタンスを割り当てる
        $this.ClassScopeObject = New-Object TestClassA
    }

    TestClassB([int]$Indata){
        $this.ClassScopeObject = New-Object TestClassA($Indata)
    }


    [int] hoge([int]$Indata){
        # $this を使ってプロパティとしてアクセスする
        return $this.ClassScopeObject.Add($Indata)
    }
}

# インスタンス化
$TestObject = New-Object TestClassB

# メソッドを呼び出す
$TestObject.hoge(5)
$TestObject.hoge(5)

 

PS D:\> D:\temp\test02.ps1
5
10
PS D:\>

 

クラスがプロパティとして保持されているのがわかりますね。

 

.NET Framework クラスも同様に使用することが出来ます。

# .NET Framework を使うクラス
class TestClass{

    # .NET Framework クラスをプロパティ定義する
    [System.Text.AsciiEncoding] $Encoding

    # コンストラクタ
    TestClass(){
        # $this を使ってプロパティにインスタンスを割り当てる
        $this.Encoding = New-Object System.Text.AsciiEncoding
    }

    # プロパティ化した .NET Framework クラスを使うメソッド
    [String] Encode([byte[]]$Date, [int]$Start, [int]$Lenth){
        return $this.Encoding.GetString($Date, $Start, $Lenth)
    }
}

 

クラスの中でも別のクラスが使えるので、内部データを保持する必要がある仕組みは、クラスとして書くと何かと便利です。

 

関連情報

PowerShell Class
http://www.vwnet.jp/Windows/etc.asp#PowerShell_Class

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.