VBScript默认属性有问题

时间:2011-04-19 21:12:16

标签: vbscript properties

我阅读了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。该默认属性采用参数列表。

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

2 个答案:

答案 0 :(得分:11)

好吧。我原以为要工作。这可能是VBScript属性getter实现中的一个错误,这会导致我的错。对不起。

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

答案 1 :(得分:-1)

你的问题在这一行:

t.foo(“Hello,World!”)

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

t.foo.bar =“你好,世界!”

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