使用其 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
}
}
我有一个 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
}
}