Jupaol
Jupaol

Reputation: 21355

How to create real objects with behavior (methods) in PowerShell?

Probably this question has been answered before.... but I have not found a specific answer to my needs.

BTW I'm using PowerShell 3

Well, I'm new in PowerShell but I have a lot of experience as a C# developer, so working with objects is very important to me.

So I'm wondering if there's a clean way to apply OOP concepts (well not all of them, though that would be awesome) in a PowerShell script, for example there are specific things that I would like to do.

Note: I'm aware that I can write C# code in PowerShell to create DTO's and also that I can create PowerShell binary modules in C#, I have done that in the past, but what I'm looking for now is the ability to write all my code in PowerShell but in an Object Oriented way.

Things I would like to do:

What I have done so far is creating objects with properties only (DTO's) but I'd like to add behavior to my objects

I'd appreciate if you guys point me in the right direction

Upvotes: 12

Views: 10280

Answers (3)

FoxDeploy
FoxDeploy

Reputation: 13537

PowerShell v5 introduces full class support, making it easy to build your own classes with properties and implement methods.

Check out Trevor's great blog post about the topic here. Trevor Sullivan, Implementing a .net Class

Standalone Example

Here is a PowerShell class of a made up type called a Fox, which has a .Deploy() method, should show how this is done

class Fox {
    # describes the sixe of the fox
    [String] $Size;
    # Property: the foxes color
    [String] $Color;

    # Constructor: Creates a new Fox object, with the specified
    #              size and name / owner.
    Fox([string] $NewSize, [String] $NewName) {
        # describes the sixe of the fox
        $this.Size = $NewSize;
        # Property: the foxes color
        $this.Color = $NewName;
    }

    # Method: Change the size of the fox     
    [void] Morph([UInt32] $Amount) {
        try {
            $this.Size = $this.Size - $Amount;
        }
        catch {
            Write-Warning -Message 'You tried to set an invalid size!';
        }
    }

    # Method: BreakGlass resets the beer size to 0.
    [void] Deploy() {
        Write-Warning -Message "The $($this.Color) fox, which is $($this.Size) in stature, goes off into the distance"        
    }
}

And in practice: enter image description here

Upvotes: 7

RB.
RB.

Reputation: 37182

If you want full OOP (including inheritance, although not interfaces), then PSClass is an MS-PL licensed implementation.

Upvotes: 4

BartekB
BartekB

Reputation: 8650

Two options to create object with methods:

  1. Add-Member
  2. New-Module -AsCustomObject

Code samples:

$person | Add-Member -MemberType ScriptMethod -Value {
    'I do stuff!'
}

$person = New-Module -AsCustomObject -ScriptBlock {
    $Property = 'value'
    [string]$Other = 'Can be strongly typed'

    function MyMethod {
        'I do stuff!'
    }

}

EDIT: speaking of private/ public... In latter example property won't show up "by default". You can decide what is public using Export-ModuleMember and specify -Variable (properties) and/or -Function (methods) that will be public. Without explicit Export-ModuleMember it will behave same as in "normal" module - export only functions (methods).

Upvotes: 13

Related Questions