How to create real objects with behavior (methods) in PowerShell?
可能这个问题之前已经被回答过……但我没有找到一个具体的答案来满足我的需要。
顺便说一句,我正在使用PowerShell3
嗯,我是PowerShell的新手,但作为一名C开发人员,我有很多经验,所以使用对象对我来说非常重要。
因此,我想知道是否有一种干净的方法可以在PowerShell脚本中应用OOP概念(当然不是所有概念,尽管这很好),例如,我想做一些特定的事情。
注意:我知道我可以在PowerShell中编写C代码来创建DTO,也可以在C中创建PowerShell二进制模块,我过去已经这样做过,但现在我要寻找的是能够在PowerShell中以面向对象的方式编写所有代码。
我想做的事情:
在PowerShell中创建对象,并公开用PowerShell编写的函数,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26function New-Person
(
[Parameter()][string]$firstName
)
{
function Walk()
{
Write-Host"Walking...";
}
$person = New-Object psobject;
$person | Add-Member -MemberType NoteProperty -Name FirstName -Value $firstName;
#This line does not work
#$person | Add-Member -MemberType CodeMethod -Name Walk -Value Walk;
return $person;
}
$MyPerson = New-Person -firstName"JP";
$MyPerson;
#This line does not work
$MyPerson.Walk();封装行为,这意味着在我的对象内创建函数,然后将它们标记为私有
[很高兴拥有]。创建基类以便继承和专门化我的行为重写方法
[很高兴拥有]。创建接口,这样我就可以在单元测试中独立思考我的PowerShell方法(我知道有像pester这样的工具可以做到这一点,我只关注OOP特性)
到目前为止,我所做的是创建仅具有属性的对象(DTO),但我想将行为添加到我的对象中。
如果你们能给我指明正确的方向,我将不胜感激。
使用方法创建对象的两个选项:
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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!' } } |
编辑:说到私人/公共…在后一个示例中,属性不会"默认"显示。您可以使用
如果您想要完整的OOP(包括继承,尽管不是接口),那么psclass是一个MS-PL许可的实现。
PowerShellv5引入了完整的类支持,使得使用属性和实现方法构建自己的类变得容易。
看看特雷弗关于这个话题的博客文章。Trevor Sullivan,实现.NET类