使用其 parent class 的实例构建 child class

Constructing a child class with instance of its parent class

我有一个 parent class 有很多成员。在构造它的 child class 时,我希望尽可能避免使用一堆输入参数来引用基本构造函数。

是否可以通过输入其parentclass的object构造childclass,并自动拥有所有parent 成员由 parent class object 定义,而不引用基本构造函数或单独引用每个成员?

类似于:

class parent {
    $name
    $type
    parent ($processName, $processType ) {
        $this.Name = $processName
        $this.Type = $processType
    }
}

PS>$newParent = [parent]::new('FirstJob', 'report')
PS>$newParent.Name
FirstJob

class child : parent {
    $order

    child ( [parent]$process, $processOrder ) {
        $this.type  = $process.type
        $this.order = $processOrder
    }
}

PS>$newChild = [child]::new($newParent, 1)
PS>$newChild.Name
FirstJob

成员名称将通过 parent object.

的输入在 child object 中自动定义

这对我不起作用,因为 child class 似乎需要引用基本构造函数。有可能避免这种情况吗?对于 1 个成员,引用基础 class 构造函数(或在 child 构造函数中重新定义 parent 成员)看起来微不足道,但我有大约 8-10 个成员,并且想保留child class 中的代码着重于其构造。

作为解决方法,我所做的是使用 single-argument 输入重载 parent 构造函数,即以下内容:

class parent {
    $name
    $type
    parent ($processName, $processType ) {
        $this.processName = $processName
        $this.processType = $processType
    }

    parent ( [parent]$parent ) {
        $this.name = $parent.name
    }
}

然后我用 parent 中的新基础构造函数构造 child class:

class child : parent {
    $order

    child ( [parent]$process, $processOrder ) : base ($process) {
        $this.type  = $process.type
        $this.order = $processOrder
    }
}
PS>$newChild = [child]::new($newParent, 1)
PS>$newChild.Name
FirstJob

这没问题,但如果我不必在新的 parent 构造函数中列出成员映射,那就太好了。如果可以的话,我想尽量减少 parent class 定义中的代码,只是为了让事情最少化并且更容易阅读。

PowerShell 中是否有来自 parent class 的任何类型的自动 member-inheritance?

在上面的 parent 基本构造函数中,我什至祈祷并尝试 $this.* = $process 当然不行。

您可以使用反射枚举copy-constructor中基class声明的所有属性:

class Parent
{
  [string]$Name
  [string]$Type

  Parent([string]$ProcessName, [string]$ProcessType){
    $this.Name = $ProcessName
    $this.Type = $ProcessType
  }

  # define copy-constructor that blindly copies all property values from reference object to itself
  Parent([Parent]$referenceObject) {
    foreach($Property in [Parent].GetProperties()){
      $Property.SetValue($this, $referenceObject.$($Property.Name))
    }
  }
}

此处,[Parent].GetProperties() 将为属于 [Parent] 的每个 属性(例如 [string]$Name[string]$Type)提供 return 元数据,并允许我们从引用对象中复制这两个的值。

现在您只需在构造子实例时将父实例传递给 copy-constructor 即可:

class Child : Parent
{
  $Order

  Child([Parent]$ParentProcess, $ProcessOrder) : base($ParentProcess)
  {
    $this.Order = $ProcessOrder
  }
}

class AnotherChild : Parent
{
  $SomethingElse

  AnotherChild([Parent]$ParentProcess, $ProcessInfo) : base($ParentProcess)
  {
    $this.SomethingElse = $ProcessInfo
  }
}