是否可以在powershell v5中创建子类?

时间:2015-02-01 07:38:22

标签: powershell powershell-v5.0

我今天下午试图找到一个解决方案,但到目前为止我只取得了部分成功......

这是我的代码:

class Animal {
    [int] $numOfLegs = 0;
    [int] $numOfEyes = 2;

    [scriptblock] $dog = { 
        class Dog { 
            [int] $numOfLegs = 4
            [int] getLegs(){ return $this.numOfLegs; }
            [int] getEyes(){ return $numOfEyes; }
        }

        return [dog]::new()       
     }
}

(Dog类可以通过这样做来实例化):

$mypetdog = & ([animal]::new().Dog)

基本上,我的想法是尝试让scriptblocks充当闭包,以便可以调用Animal中包含的每个“子类”定义(并且仍然可以访问它的父作用域)。因此,例如,当对Dog对象执行getEyes()时,它理论上会返回数字2.但是这不起作用,因为我认为scriptblock无法在其自己的范围之外看到(在类中定义时)。

所以当我这样做时:

$mypetdog.getLegs()

它正确返回4,但是当我这样做时:

$mypetdog.getEyes()

Powershell不知道变量$ numOfEyes是什么,然后抛出错误,因为变量在类中是未定义的。

有没有人有解决方案在PowerShell中模仿子类而不使用add-type?

2 个答案:

答案 0 :(得分:3)

创建PowerShell 5.0中的类是为了简化不需要继承的DSC资源的开发,因此尚不支持此类。正如你在下面看到的,他们会对它进行处理,但是没有ETA,这意味着你可能要等到v6 +。

  

九月预览的重点是能够编写DSC   资源通过PowerShell类。这不需要继承,   所以你是对的,9月份不支持继承   预览

     

对于没有继承的许多事情,类仍然有用 - 对于   示例C是活着的,它仍然没有成员   功能,更不用说继承了。

     

那就是说,我们显然明白了继承的重要性。没有   承诺什么时候可用,但它是我们的   致力于

来源:WMF blog - Comments

您可以尝试使用New-Object$obj.psobject.copy()Add-Member(以定义子类的属性和函数)来处理某些工作,就像有人描述here < / p>

更新:PowerShell 5.0 RTM中提供了类继承。例如:

class Vehicle {
    [string]$Make
    [string]$Model
    [string]$Color

}    

class Car : Vehicle {
    [string]$VIN
}

$car = [car]@{
    Make = "Ford"
    Model = "Mustang"
    Color = "Red"
    VIN = "123456"
}
$car


VIN    Make Model   Color
---    ---- -----   -----
123456 Ford Mustang Red  

答案 1 :(得分:1)

继承由&#34;:&#34;操作员以非常简单的方式。

class Animal {
[int] $numOfLegs = 0;
[int] $numOfEyes = 2;

  Animal(){} <- Constructor         
 }


class Dog : Animal { 
        [int] $numOfLegs = 4
  Dog(){} <- Constructor of dogs
        [int] getLegs(){ return $this.numOfLegs; }
        [int] getEyes(){ return $numOfEyes; }
    }

 New-Object Dog