开发者

Trouble with VBScript default properties

I read Eric Lippert's article on default property semantics in VBScript: http://blogs.msdn.com/b/ericlippert/archive/2005/08/30/458051.aspx

It says:

The rule for implementers of IDispatch::Invoke is if all of the following are true:

  • the caller invokes a property
  • the caller passes an argument list
  • the property does not actually take an argument list
  • that property returns an object
  • that object has a default property
  • that default property takes an argument list

then invoke the default property with the argument list. Strange but true.

This seems on its face to be an odd rule, but it's invaluable when you're working with collections. Or at least, it would be, but I can't seem to get it to work.

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 prope开发者_JAVA技巧rty
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'"

The caller invokes the foo property and passes an argument list. The foo property does not actually take an argument list. The foo property returns an object of type Test2. Test2 has a default property, bar. That default property takes an argument list.

Is this a bug, or am I misunderstanding either the default property semantics or my code?


Well golly. I would have expected that to work. It's probably a bug in the implementation of VBScript property getters, which would make it my fault. Sorry about that.

Since the last person to touch that code was me in 1998, I wouldn't expect a fix to be forthcoming any time soon.


Your problem is in this line:

t.foo("Hello, World!")

Your Test2 class does not have a method named foo. What you mean to do is this:

t.foo.bar = "Hello, World!"

Your code is also incomplete. Unless you intend on your properties being read-only, you should assign setters as well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜