我今天下午试图找到一个解决方案,但到目前为止我只取得了部分成功......
这是我的代码:
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?
答案 0 :(得分:3)
创建PowerShell 5.0中的类是为了简化不需要继承的DSC资源的开发,因此尚不支持此类。正如你在下面看到的,他们会对它进行处理,但是没有ETA,这意味着你可能要等到v6 +。
九月预览的重点是能够编写DSC 资源通过PowerShell类。这不需要继承, 所以你是对的,9月份不支持继承 预览强>
对于没有继承的许多事情,类仍然有用 - 对于 示例C是活着的,它仍然没有成员 功能,更不用说继承了。
那就是说,我们显然明白了继承的重要性。没有 承诺什么时候可用,但它是我们的 致力于。
您可以尝试使用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