【问题标题】:Trouble with VBScript default propertiesVBScript 默认属性的问题
【发布时间】:2011-04-19 21:12:16
【问题描述】:

我阅读了 Eric Lippert 关于 VBScript 中默认属性语义的文章:http://blogs.msdn.com/b/ericlippert/archive/2005/08/30/458051.aspx

上面写着:

IDispatch::Invoke 实现者的规则是,如果以下所有条件都为真:

  • 调用者调用一个属性
  • 调用者传递一个参数列表
  • 该属性实际上没有参数列表
  • 该属性返回一个对象
  • 该对象具有默认属性
  • 默认属性采用参数列表

然后使用参数列表调用默认属性。奇怪但真实。

从表面上看,这似乎是一条奇怪的规则,但当您使用集合时,它却是无价之宝。或者至少,它会是,但我似乎无法让它工作。

class Test1
    public property get foo
        set foo = new Test2
    end property
end class

class Test2
    public default property get bar (arg)
        Response.Write arg
    end property
end class

dim t: set t = new Test1
Response.Write TypeName(t.foo) ' => "Test2"
t.foo.bar("Hello, World!") ' => "Hello, World!"
t.foo("Hello, World!") => "Microsoft VBScript runtime error '800a01c2' / Wrong number of arguments or invalid property assignment: 'foo'"

调用者调用foo 属性并传递一个参数列表。 foo 属性实际上并不采用参数列表。 foo 属性返回 Test2 类型的对象。 Test2 有一个默认属性 bar。该默认属性采用参数列表。

这是一个错误,还是我误解了默认属性语义或我的代码?

【问题讨论】:

    标签: vbscript properties


    【解决方案1】:

    天哪。我本来希望这样做的。这可能是 VBScript 属性获取器的实现中的一个错误,这将是我的错。对此感到抱歉。

    自从 1998 年最后一个接触该代码的人是我,我不认为很快就会有修复。

    【讨论】:

      【解决方案2】:

      你的问题出在这一行:

      t.foo("你好,世界!")

      您的 Test2 类没有名为 foo 的方法。你的意思是这样的:

      t.foo.bar = "你好,世界!"

      您的代码也不完整。除非您打算将您的属性设为只读,否则您也应该分配 setter。

      【讨论】:

      • 我不确定你在说什么。这是一个最小的测试用例,不是实用的代码。这些属性的存在只是为了演示我得到的行为,这与 setter 无关。
      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多