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

超簡単な PowerShell Class の使い方(その2/オーバーロード)


前回の説明で PowerShell のクラスがどんなモノか大体わかったと思います。

今回は class の使い勝手を良くする「オーバーロード」について解説します。

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

 

オーバーロード

オブジェクト指向プログラミングに馴染みが無いと、「オーバーロード」と聞いても「は? 何の事??」 ですよね w

 

「オーバーロード」をざっくりと表現すると、引数の種類に合わせたメソッドを実行する機能です。

 

PowrShell の変数は、型を意識しなくても良しなに処理してくれるので、[int] とか [string] とか明示的に型を指定する事は少ないのですが、前回の説明で、[int] とか [string] とか明示的に型を指定しているを見て「何で? 面倒だなぁ... 」と疑問に思った方も多いと思います。

実は、ここにオーバーロードの秘密が隠されているのです。

class に実装するメソッドは、引数の型によって実行されるメソッドが選択されます。

どういう動きをするのか見るのが早いですね。

[D:\temp\test11.ps1]

class TestClass11{
    [int] $iData        # int 型内部データ
    [string] $strData   # string 型内部データ

    # int 型を扱う Add メソッド
    [int] Add ( [int] $Indata ){
        $this.iData += $Indata
        return $this.iData
    }

    # string 型を扱う Add メソッド
    # int 型を扱う Add メソッド
    [string] Add ( [string] $Indata ){
        $this.strData += $Indata
        return $this.strData
    }
}

# インスタンス化
$TestObject11 = New-Object TestClass11

# 数値計算
$TestObject11.Add(10)

$TestObject11.Add(15)

# 文字列操作
$TestObject11.Add("This is ")

$TestObject11.Add("string.")

 

これを実行するとこのようになります。

PS D:\> D:\temp\test11.ps1
10
25
This is
This is string.
PS D:\>

 

このように、多重定義された Add メソッドなのですが、受け取った変数の型によって実行されるメソッドが違うのがわかりますね。

このオーバーロードを実現するために class では型を明示的に書く必要があるのです。

「だから何? 便利なの?」ですよね ww

PowerShell では、皆さん既にオーバーロードを使っているのです。

$a = 10
$b = "Test String"

 

こんな感じで、扱うのが数値なのか文字列なのかといった型を意識せず同じように使えるので、class の使い勝手が良くなるのがオーバーロードの良さです。

 

コンストラクタのオーバーロード

オーバーロードの一番の出番はコントラクタかもしれません。

コントラクタでオーバーロードを使うと、class をインスタンス化する際に、初期値をセットする場合と初期値をセットしない場合の両方をサポートすることができます。

[D:\temp\test12.ps1]

class TestClass12{
    [int] $Data     # int 型内部データ

    # 初期値を受け取るコンストラクタ
    TestClass12( [int] $InData ){
        $this.Data = $InData
    }

    # 初期値を受け取らないコンストラクタ
    TestClass12(){
        $this.Data = 0
    }


    # Add メソッド
    [int] Add ( [int] $Indata ){
        $this.Data += $Indata
        return $this.Data
    }
}

# インスタンス化(初期値設定)
$TestObject12 = New-Object TestClass12(10)

$TestObject12.Add(15)

# インスタンス化(初期値なし)

$TestObject13 = New-Object TestClass12

$TestObject13.Add(20)

 

PS D:\> D:\temp\test12.ps1
25
20
PS D:\>

 

このように、インスタンス化する際に必ず初期値をセットしなくてはいけないといった制限がなくなるので、class の使い勝手が良くなります。

 

関連情報

超簡単な PowerShell Class の使い方(その1)
http://www.vwnet.jp/Windows/PowerShell/2017082001/PSv5Class01.htm

超簡単な PowerShell Class の使い方(その3/static)
http://www.vwnet.jp/Windows/PowerShell/2017082201/PSv5Class03.htm

超簡単な PowerShell Class の使い方(その4/継承)
http://www.vwnet.jp/Windows/PowerShell/2017082301/PSv5Class04.htm

超簡単な PowerShell Class の使い方(その5/スコープ)
http://www.vwnet.jp/Windows/PowerShell/2017082302/PSv5Class05.htm

超簡単な PowerShell Class の使い方(その6/まとめ)
http://www.vwnet.jp/Windows/PowerShell/2017082401/PSv5Class06.htm

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

PowerShell クラスを使用したカスタム型の作成Creating Custom Types using PowerShell Classes | Microsoft Docs
https://docs.microsoft.com/ja-jp/powershell/wmf/5.0/class_overview

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.