Powershell 子类构造函数 - 找不到“new”的重载

eww*_*eww 3 powershell

Powershell:5.1.1904.1

操作系统:Windows 10 Pro x64,版本 2004

我可能在这里遗漏了一些非常明显的东西,但是......

我有一个基类和一个子类。

class Vehicle {
    [string]$Name
    Vehicle($Name) {
        $this.Name = $Name
    }
}

class Car : Vehicle {
    [int]$NumWheels
    Car($Name, $NumWheels) {
        $this.NumWheels = $NumWheels
    }
}

$testVar = [Car]::new("Ford Fiesta", 4)
Run Code Online (Sandbox Code Playgroud)

当调用子类构造函数时,我收到消息

找不到“new”的重载且参数计数:“0”。

当我删除类继承时,我可以调用构造函数。Powershell 似乎找到了它。

当我删除继承并获取有关构造函数的信息时

[Car]::new
Run Code Online (Sandbox Code Playgroud)

我懂了

OverloadDefinitions                                   
-------------------                                   
Car new(System.Object Name, System.Object NumWheels) 
Run Code Online (Sandbox Code Playgroud)

当指定继承时(Car:Vehicle)我仍然得到

OverloadDefinitions                                   
-------------------                                   
Car new(System.Object Name, System.Object NumWheels) 
Run Code Online (Sandbox Code Playgroud)

完全不清楚为什么它似乎看到了构造函数,但在继承时我无法调用它。

我知道我一定在这里做错了什么。:P

先感谢您

mkl*_*nt0 6

为了补充Doug Maurer 的有用答案:

问题的最终原因是您的类没有默认的构造函数(始终是无参数构造函数) ,正如 Doug 指出的那样,这是该类至少具有一个显式定义的构造函数 ( )的结果。一旦您至少拥有一个显式定义的构造函数,您就必须显式定义一个无参数的构造函数( ) - 如果需要的话。VehicleVehicle($Name) { ... }Vehicle() { ... }

直接原因是派生中的构造函数隐式尝试调用基类上的无参数构造函数,因为您尚未将显式基类构造函数调用指定为派生类构造函数的一部分。CarVehiclebase(...)

因此,正确的解决方案是显式调用基类构造函数,即带有$Name参数的构造函数:

# Note the call to the base-class constructor via `base`
Car($Name, $NumWheels) : base($Name) {
    $this.NumWheels = $NumWheels
}
Run Code Online (Sandbox Code Playgroud)

这样就不需要仅仅为了继承而向基类添加无参数构造函数。

也可以看看:about_Classes