【问题标题】:Powershell subclass constructor - Cannot find an overload for "new"Powershell 子类构造函数 - 找不到“new”的重载
【发布时间】:2021-01-02 17:43:47
【问题描述】:

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)

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

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

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

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

[Car]::new

我明白了

OverloadDefinitions                                   
-------------------                                   
Car new(System.Object Name, System.Object NumWheels) 

当指定继承时(汽车:车辆)我仍然得到

OverloadDefinitions                                   
-------------------                                   
Car new(System.Object Name, System.Object NumWheels) 

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

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

提前谢谢你

【问题讨论】:

    标签: powershell


    【解决方案1】:

    补充Doug Maurer's helpful答案:

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

    直接原因是你的派生类中的构造函数Car隐式试图调用一个argument-less 基类 Vehicle 上的构造函数,因为您没有通过 base(...) 指定 显式 基类构造函数调用作为派生类构造函数的一部分.

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

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

    这避免了仅仅为了继承而向基类添加无参数构造函数的需要。

    另请参阅:about_Classes

    【讨论】:

      【解决方案2】:

      错误“没有参数计数为 0 的重载”是因为没有默认构造函数。当您创建自己的构造函数时,不再为您提供默认构造函数。另一个问题是您没有通过分配名称来履行合同。

      [Vehicle]创建一个默认构造函数

      class Vehicle {
          [string]$Name
          Vehicle(){}
          Vehicle($Name) {
              $this.Name = $Name
          }
      }
      
      class Car : Vehicle {
          [int]$NumWheels
      
          Car($Name, $NumWheels) {
              $this.NumWheels = $NumWheels
              $this.Name = $Name
          }
      }
      
      [Car]::new("Ford Fiesta",4)
      
      NumWheels Name       
      --------- ----       
              4 Ford Fiesta
      

      或者只是从中删除自定义构造函数

      class Vehicle {
          [string]$Name
      }
      
      class Car : Vehicle {
          [int]$NumWheels
      
          Car($Name, $NumWheels) {
              $this.NumWheels = $NumWheels
              $this.Name = $Name
          }
      }
      
      [Car]::new("Ford Fiesta",4)
      
      NumWheels Name       
      --------- ----       
              4 Ford Fiesta
      

      【讨论】:

      • 抱歉,我以为我之前已经回复说“谢谢”。首先 - 谢谢。这很有帮助。我很欣赏示例代码更新来解释我做错了什么。
      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多