Chapter4/4.9_Class/Person.ps1

# 基底クラス
class Person {
    # staticプロパティ
    static [string]$Kind = "Human"

    # パブリックプロパティ
    [string]$Name; # 型が指定されないと[object]扱い
    [int]$Age; # ; か改行を終端に用いる

    # Hidden プロパティ
    hidden [string]$Secret

    # コンストラクター
    Person() {
    }

    # 引数ありコンストラクター
    Person([string]$name, [int]$age) {
        $this.Name = $name
        $this.Age = $age
    }

    # インスタンスメソッド
    # [返戻値の型]メソッド名(引数)で定義する
    [string] GetSecret() {
        return $this.Secret
    }

    # voidにすると値が返さないことを意味する
    [void] Hello() {
        [Console]::WriteLine("Hello $($this.Name).")
    }

    # voidにすると値が返さないことを意味する
    [void] Hello([string]$name) {
        [Console]::WriteLine("Hello $name.")
    }
    
    # Hiddenキーワードはメソッドにも付与できる
    hidden [void] SetSecret([string]$secret) {
        $this.Secret = $secret
    }

    # スタティックメソッド
    static [string] GetKind() {
        return [Person]::Kind
    }

    [string] ToString() {
        return $this.Name + "($($this.Age))"
    }
}


$foo = [Person]::new("Foo", 20)
$bar = [Person]::new("Bar", 24)
$hoge = New-Object Person -ArgumentList "Hoge", 32
$piyo = [Person]@{
    Name = "Piyo"
    Age  = 26
}
$typeName = "Person"
$tyger = New-Object $typeName -ArgumentList "tyger", 40