PowerShellで、class構文を使わずに、classを定義する
Follow @venividivici830
PowerShell 5.0からはclassキーワードが使えますが、PowerShell 4.0ではclassキーワードを使えないので、以下のようにやっていました。
PowerShell 2.0でも動作を確認しています。
Person.psm1
main.ps1
下記のディレクトリー構成で配置しました。
Person.psm1は、classの定義ファイルで、外部ファイルとして作成しました。
getInstanceが、インスタンスを生成、初期化して返すfunctionで、コンストラクターみたいなものです。
インスタンスはpsobjectとして作成し、Add-Memberで、プロパティーとメソッドを追加しました。
上の例では、プロパティーとして、名前を表現するname、メソッドとして、ゲッター(getName)とセッター(setName)を定義しました。
インスタンスのメンバーには、$thisを介してアクセスできます。
プライベートメソッドの作り方はわからなかったです。命名規則でやるしかない?
main.ps1は、classを利用するスクリプトです。
Person.psm1をPrefix付きで読み込んで、Person.getInstanceのようにアクセスできるようにしました。
getInstanceでインスタンスを初期化、取得し、getNameメソッド、setNameメソッドを呼んでいます。
実行すると、予期した動きとなりました。
$ pwsh main.ps1
Lennon
Paul
PowerShell 5.0からはclassキーワードが使えますが、PowerShell 4.0ではclassキーワードを使えないので、以下のようにやっていました。
PowerShell 2.0でも動作を確認しています。
Person.psm1
function getInstance ($name) { $instance = New-Object -TypeName psobject # プロパティーを定義 $instance | Add-Member -MemberType NoteProperty -Name "name" -Value $name # メソッドを定義 $instance | Add-Member -MemberType ScriptMethod -Name "getName" -Value {getName} $instance | Add-Member -MemberType ScriptMethod -Name "setName" -Value { param($name) setName $name } return $instance } function getName () { return $this.name } function setName ($name) { $this.name = $name }
main.ps1
$env:PSModulePath += ":classes" Import-Module Person -Prefix Person. $person1 = Person.getInstance "John" $person2 = Person.getInstance "Paul" $person1.setName("Lennon") $person1.getName() $person2.getName()
下記のディレクトリー構成で配置しました。
. ├── classes │ └── Person │ └── Person.psm1 ├── main.ps1
Person.psm1は、classの定義ファイルで、外部ファイルとして作成しました。
getInstanceが、インスタンスを生成、初期化して返すfunctionで、コンストラクターみたいなものです。
インスタンスはpsobjectとして作成し、Add-Memberで、プロパティーとメソッドを追加しました。
上の例では、プロパティーとして、名前を表現するname、メソッドとして、ゲッター(getName)とセッター(setName)を定義しました。
インスタンスのメンバーには、$thisを介してアクセスできます。
プライベートメソッドの作り方はわからなかったです。命名規則でやるしかない?
main.ps1は、classを利用するスクリプトです。
Person.psm1をPrefix付きで読み込んで、Person.getInstanceのようにアクセスできるようにしました。
getInstanceでインスタンスを初期化、取得し、getNameメソッド、setNameメソッドを呼んでいます。
実行すると、予期した動きとなりました。
$ pwsh main.ps1
Lennon
Paul
コメント
コメントを投稿