具有多态性和单例模式的PowerShell类

具有多态性和单例模式的PowerShell类,powershell,polymorphism,singleton,Powershell,Polymorphism,Singleton,我试图实现一个使用多态性和单例模式的类。最终的目标是,在实例化子类时,基于要处理的传递的文件数组,有许多子类处理不同类型的XML文件,然后存储组合的和经过处理的XML以供以后重用。有许多方法对于所有或大多数子类都是通用的(加载单个XML文件并检查其有效性,检查XML在某些情况下是否有签名,等等),因此将这些方法放在父类中是有意义的。每个子类也将有唯一的方法。我希望每个子类都是一个单独的类,因为可能有很多XML文件要处理,并且会有数百个对处理后的XML的引用,所以我只希望加载和处理一次。 我从博客

我试图实现一个使用多态性和单例模式的类。最终的目标是,在实例化子类时,基于要处理的传递的文件数组,有许多子类处理不同类型的XML文件,然后存储组合的和经过处理的XML以供以后重用。有许多方法对于所有或大多数子类都是通用的(加载单个XML文件并检查其有效性,检查XML在某些情况下是否有签名,等等),因此将这些方法放在父类中是有意义的。每个子类也将有唯一的方法。我希望每个子类都是一个单独的类,因为可能有很多XML文件要处理,并且会有数百个对处理后的XML的引用,所以我只希望加载和处理一次。 我从博客文章中获得了对PowerShell OOP的基本理解

这就是我现在要验证的模式,它“起作用”,但在我看来,单例方法对于所有子类来说都是通用的,因此实际上应该在父类中,但它们也需要使用子类类型实现,而不是父类类型。是否存在将这些方法移动到父类的机制,但父类是否知道调用的子类的类型?除了简单地包含子类类型作为参数之外

class ParentClass {
    # Properties
    [collections.arrayList]$Files = [collections.arrayList]::New()

    # Methods
    [void] ListFiles() {
        Write-Host "Processed Files:"
        foreach ($processedFile in $this.Files) {
            Write-Host "$processedFile!"
        }
    }
}

class ChildClass : ParentClass {
    # Properties
    static [ChildClass] $instance

    # Constructor
    ChildClass([string[]]$filePaths){
        foreach ($fileToProcess in $filePaths) {
            $this.Files.Add("$($fileToProcess): Processed ($(Get-Date))")
            Start-Sleep -s:1
        }
    }

    # Singleton Methods
    static [ChildClass] GetInstance() {
        return [ChildClass]::Instance
    }
    static [ChildClass] GetInstance([string[]]$filePaths) {
        if ([ChildClass]::Instance -eq $null) {
            [ChildClass]::Instance = [ChildClass]::New($filePaths)
        }

        return [ChildClass]::Instance
    }
}

CLS
$unprocessedFiles = @('C:\file1', 'C:\file2', 'C:\file3')
$firstInstance = [ChildClass]::GetInstance($unprocessedFiles)
$firstInstance.ListFiles()
Start-Sleep -s:5
$secondInstance = [ChildClass]::GetInstance()
$secondInstance.ListFiles()
我曾希望
GetType()
可能会有所帮助,因为父类中的
$this.GetType()
确实返回子类类型,但这两个都失败了

static [$this.GetType()] GetInstance() {
}
static [$($this.GetType())] GetInstance() {
}
正如在父类中设置属性并将其用作以下类型一样

$type = $this.GetType()
static [$type] GetInstance() {
}
我还尝试了使用和不使用
()
$()
包装,以及使用和不使用
[]
类型标记

[$this.GetType().ToType()] GetInstance() {
}

此外,在实现时,如果第一个GetInstance不包含文件路径数组,以及任何后续的GetInstance不包含文件路径数组,我可能会抛出一个异常。但这似乎很笨拙,我想知道是否有更好的方法来实现这一点?或者这对我来说似乎很笨拙,因为我仍然习惯于为每一个参数排列重载?

我确实喜欢使用good来解决问题,但根据我的经验,尝试在PowerShell中使用静态类型的OOP实践会适得其反,我试着坚持使用惯用的PowerShell。大多数PowerShell项目不需要那种抽象级别,而且PowerShell类的功能有限,您将不得不不断地与之抗争。@logicaldiagram我很想听听您觉得会有什么问题。我正在重构大约15K行代码,到目前为止,与函数相比,类似乎是天赐良机。我有一种感觉,它将在可维护性和可扩展性方面创造奇迹,这两个方面我多年来一直在努力解决。在PowerShell中运行时,您可以非常轻松地编译C,因此,一旦您超越了一些基本用例,比如您正在尝试的,在C中构建类型并在PowerShell中使用它们通常会容易得多。您无法在PS中定义接口,甚至在实现某些C#接口时会遇到问题。您没有成员访问修饰符。测试可能很有挑战性,因为您可以尝试更新类型,但实际上,定义在当前PS运行空间中不会更改。我同意功能性PowerShell中的15k行如果没有代码复制是很难做到的。我确实喜欢使用good来解决问题,但根据我的经验,尝试在PowerShell中使用静态类型的OOP实践会适得其反,我尝试坚持使用惯用的PowerShell。大多数PowerShell项目不需要那种抽象级别,而且PowerShell类的功能有限,您将不得不不断地与之抗争。@logicaldiagram我很想听听您觉得会有什么问题。我正在重构大约15K行代码,到目前为止,与函数相比,类似乎是天赐良机。我有一种感觉,它将在可维护性和可扩展性方面创造奇迹,这两个方面我多年来一直在努力解决。在PowerShell中运行时,您可以非常轻松地编译C,因此,一旦您超越了一些基本用例,比如您正在尝试的,在C中构建类型并在PowerShell中使用它们通常会容易得多。您无法在PS中定义接口,甚至在实现某些C#接口时会遇到问题。您没有成员访问修饰符。测试可能很有挑战性,因为您可以尝试更新类型,但实际上,定义在当前PS运行空间中不会更改。我同意如果没有代码复制,在functional PowerShell中很难实现15k行。