Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell重写赋值和比较运算符_Powershell_Class_Operator Overloading_Powershell 5.0 - Fatal编程技术网

Powershell重写赋值和比较运算符

Powershell重写赋值和比较运算符,powershell,class,operator-overloading,powershell-5.0,Powershell,Class,Operator Overloading,Powershell 5.0,使用Powershell 5,您现在可以实现自定义类。随着时间的推移,您最终会希望开始重载操作符,以执行以下操作 class Number { [int] $value = 0 Number() {} # empty constructor Number ([int]$somethingElse) {$this.value = $somethingElse} } $one = [number]::new(1) $two = [number]::new

使用Powershell 5,您现在可以实现自定义类。随着时间的推移,您最终会希望开始重载操作符,以执行以下操作

class Number
{
    [int] $value = 0

    Number() {} # empty constructor

    Number ([int]$somethingElse)
        {$this.value = $somethingElse}
}

$one = [number]::new(1)
$two = [number]::new(2)
$three = $one + $two
if ($three -eq ($one + $two))
    {"3 = 1 + 2"}
else
    {"3 <> 1 + 2 "}
类号
{
[int]$value=0
Number(){}#空构造函数
数字([int]$somethingElse)
{$this.value=$somethingElse}
}
$one=[number]::新的(1)
$two=[number]::新的(2)
$3=$1+$2
如果($3-相等($1+$2))
{"3 = 1 + 2"}
其他的
{"3  1 + 2 "}

但这似乎没有很好的文档记录,在搜索堆栈溢出后,我找不到如何执行此操作

通常认为在powershell中无法执行此操作。不幸的是,在几次谷歌搜索和堆栈溢出搜索之后,我就要放弃了。但后来我发现了要点,结果证明你可以

考虑到这对我来说是多么难以发现,我想为其他人提供一个清晰且格式良好的例子(当我很快忘记如何做到这一点时,还有我未来的自己)

感谢JFFail发布到Github

您将需要适当地重载这些,它们应该是不言自明的,但请随意询问是否有问题

SetValue([int]$newValue)
GetValue()
[boolean] Equals($otherNumber)
[string] ToString() # you can get more advanced by overloading "IConvertible.ToType" but that's a whole can of worms all it's own
static [MyClass] op_Addition   ([MyClass]$first, [MyClass]$second)
static [MyClass] op_Subtraction([MyClass]$first, [MyClass]$second)
static [MyClass] op_Multiply   ([MyClass]$first, [MyClass]$second)
static [MyClass] op_Division   ([MyClass]$first, [MyClass]$second)
对于
-gt
-lt
,您需要使用以下命令。注意:虽然这确实支持
-eq
,但您可以使用如上所示的
Equals(object)
来获得它,而这不需要继承自
IComparable

class MyClass : System.IComparable 
# requires inheritance from System.IComparable

[int] CompareTo($otherNumber)
# CANNOT declare type in parameter declaration, you'd have to check it later.
# 1 is greater than
# 0 is equal
# -1 is less than
# $null can be returned to indicate invalid comparison
这里有一个有效的例子

# If you don't need -lt or -gt then you don't have to inherit from System.IComparable
class Number : System.IComparable
{
    [int] $value = 0

    Number() {} # empty constructor

    Number ([int]$somethingElse)
        {$this.value = $somethingElse}

    [void] SetValue ([int]$newValue)
        {$this.value = $newValue}

    [int] GetValue()
        {return $this.value}

    [boolean] Equals($otherNumber)
    {
        if ($this.value -eq $otherNumber.GetValue())
            {return $true}
        else
            {return $false}
    }

    [int] CompareTo($otherNumber)
    {
        if ($this.value -gt $otherNumber.GetValue()) {return 1}
        if ($this.value -eq $otherNumber.GetValue()) {return 0}
        if ($this.value -lt $otherNumber.GetValue()) {return -1}
        return $null
    }

    [string] ToString()
        {return $this.value.ToString()}

    static [Number] op_Addition ([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() + $second.GetValue())}

    static [Number] op_Subtraction([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() - $second.GetValue())}

    static [Number] op_Multiply([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() * $second.GetValue())}

    static [Number] op_Division([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() / $second.GetValue())}
}

# Very Basic Unit Tests
$firstNumber = [Number]::new(8)
$secondNumber = [Number]::new(12)
$thirdNumber = [Number]::new(8)

if ($firstNumber -eq $secondNumber)
    {Write-Output ("{0} == {1}" -F $firstNumber, $secondNumber)}
else
    {Write-Output ("{0} <> {1}" -F $firstNumber, $secondNumber)}

if ($firstNumber -eq $thirdNumber)
    {Write-Output ("{0} == {1}" -F $firstNumber, $thirdNumber)}
else
    {Write-Output ("{0} <> {1}" -F $firstNumber, $thirdNumber)}

switch ($true)
{
    ($firstNumber -gt $secondNumber) {Write-Output ("{0} > {1}" -F $firstNumber, $secondNumber)}
    ($firstNumber -eq $secondNumber) {Write-Output ("{0} == {1}" -F $firstNumber, $secondNumber)}
    ($firstNumber -lt $secondNumber) {Write-Output ("{0} < {1}" -F $firstNumber, $secondNumber)}
}

$fourthNumber = $firstNumber + $secondNumber
Write-Output ("{0} = {1} + {2}" -F $fourthNumber, $firstNumber, $secondNumber)

$fifthNumber = $secondNumber - $thirdNumber
Write-Output ("{0} = {1} - {2}" -F $fifthNumber, $secondNumber, $thirdNumber)

$sixthNumber = $firstNumber * $secondNumber
Write-Output ("{0} = {1} * {2}" -F $sixthNumber, $firstNumber, $secondNumber)

$seventhNumber = $sixthNumber / $firstNumber
Write-Output ("{0} = {1} / {2}" -F $seventhNumber, $sixthNumber, $firstNumber)
#如果不需要-lt或-gt,则不必从System.IComparable继承
类别编号:System.IComparable
{
[int]$value=0
Number(){}#空构造函数
数字([int]$somethingElse)
{$this.value=$somethingElse}
[void]SetValue([int]$newValue)
{$this.value=$newValue}
[int]GetValue()
{返回$this.value}
[boolean]等于($otherNumber)
{
if($this.value-eq$otherNumber.GetValue())
{返回$true}
其他的
{返回$false}
}
[int]比较($otherNumber)
{
if($this.value-gt$otherNumber.GetValue()){return 1}
if($this.value-eq$otherNumber.GetValue()){return 0}
if($this.value-lt$otherNumber.GetValue()){return-1}
返回$null
}
[string]ToString()
{返回$this.value.ToString()}
静态[Number]运算加法([Number]$first,[Number]$second)
{return[Number]::new($first.GetValue()+$second.GetValue())}
静态[Number]运算减法([Number]$first,[Number]$second)
{return[Number]:new($first.GetValue()-$second.GetValue())}
静态[Number]运算乘法([Number]$first,[Number]$second)
{return[Number]::new($first.GetValue()*$second.GetValue())}
静态[Number]运算分割([Number]$first,[Number]$second)
{return[Number]::new($first.GetValue()/$second.GetValue())}
}
#非常基本的单元测试
$firstNumber=[Number]::新(8)
$secondNumber=[Number]::新(12)
$thirdNumber=[Number]::新(8)
if($firstNumber-eq$secondNumber)
{写入输出(“{0}=={1}”-F$firstNumber,$secondNumber)}
其他的
{写入输出(“{0}{1}”-F$firstNumber,$secondNumber)}
if($firstNumber-eq$thirdNumber)
{写入输出(“{0}=={1}”-F$firstNumber,$thirdNumber)}
其他的
{写入输出(“{0}{1}”-F$firstNumber,$thirdNumber)}
开关($true)
{
($firstNumber-gt$secondNumber){写入输出(“{0}>{1}”-F$firstNumber,$secondNumber)}
($firstNumber-eq$secondNumber){写入输出(“{0}==={1}”-F$firstNumber,$secondNumber)}
($firstNumber-lt$secondNumber){写入输出(“{0}<{1}”-F$firstNumber,$secondNumber)}
}
$fourthNumber=$firstNumber+$secondNumber
写入输出(“{0}={1}+{2}”-F$fourthNumber、$firstNumber、$secondNumber)
$fifthNumber=$secondNumber-$thirdNumber
写入输出(“{0}={1}-{2}”-F$fifthNumber、$secondNumber、$thirdNumber)
$sixthNumber=$firstNumber*$secondNumber
写入输出(“{0}={1}*{2}”-F$sixthNumber、$firstNumber、$secondNumber)
$seventhNumber=$sixthNumber/$firstNumber
写入输出(“{0}={1}/{2}”-F$seventhNumber、$sixthNumber、$firstNumber)
这是输出

> 8 <> 12
> 8 == 8
> 8 < 12
> 20 = 8 + 12
> 4 = 12 - 8
> 96 = 8 * 12
> 12 = 96 / 8
>8 12
> 8 == 8
> 8 < 12
> 20 = 8 + 12
> 4 = 12 - 8
> 96 = 8 * 12
> 12 = 96 / 8