“新”方法名是否被保留?

问题描述 投票:0回答:1

来自这个有用的问题/答案:PowerShell 中的构造函数链 - 调用同一类中的其他构造函数
为了与调用构造函数的方式保持一致(例如

[car]::new()
),并且因为“the
hidden
关键字
”无论如何都不会完全隐藏该方法,我正在考虑使用方法名称
new()
(而不是
init()
对于我的类中的构造函数“helper”方法,例如:

hidden new([string]$make) { $this.new($make, $null) }

它看起来工作正常,但不知怎的,我担心这样做可能会出现问题。

有什么理由我应该避免使用 PowerShell 类方法的名称“

new
”?

powershell class constructor overloading
1个回答
0
投票

我有什么理由应该避免使用 PowerShell 类方法的名称

new
吗?

从严格的技术考虑,抛开个人喜好/意见,只要该方法是实例方法,那么使用

new
作为其名称应该没有问题。

正如评论中所指出的,如果该方法是static,则会出现问题,因为你会与

new
内在成员发生冲突。

  • 第一个问题是需要使用反射来调用

    .ctor
    中的方法:

    class Test {
        [string] $MyParam
    
        Test() {
            [Test].GetMethod('new').Invoke($null, $this)
        }
    
        Test([string] $myParam) {
            $this.MyParam = $myParam
        }
    
        hidden static new([Test] $instance) {
            $instance.MyParam = 'default value'
        }
    }
    
    [Test]::new()
    
    # MyParam
    # -------
    # default value
    
    [Test]::new('other value')
    
    # MyParam
    # -------
    # other value
    
  • 第二个问题是重载定义会变得混乱,因为它们将显示您的方法而不是实际的构造函数:

    [Test]::new
    
    # OverloadDefinitions
    # -------------------
    # public static void new(Test instance);
    

    这里的预期是(与您正在做的定义相同

    [Test].GetConstructors()
    ):

    [Test]::new
    
    # OverloadDefinitions
    # -------------------
    # public Test();
    # public Test(string myParam);
    
© www.soinside.com 2019 - 2024. All rights reserved.