2011-04-19 53 views
9

我在VBScript閱讀埃裏克利珀對默認屬性語義的文章:http://blogs.msdn.com/b/ericlippert/archive/2005/08/30/458051.aspx麻煩VBScript的默認屬性

它說:

爲IDispatch接口::調用的執行者的規則是如果滿足以下所有的都是真:

  • 調用者可以調用屬性
  • 調用者傳遞的參數列表
  • 酒店不採取實際的參數列表
  • 該屬性返回一個對象
  • 該對象是否具有默認屬性
  • 該默認屬性採用參數列表

然後調用默認屬性參數列表。奇怪而真實。

這似乎是一個奇怪的規則,但它是非常寶貴的,當你使用集合。或者至少,這將是,但我似乎無法讓它工作。

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。該默認屬性需要一個參數列表。

這是一個錯誤,或者我誤解或者默認屬性語義或我的代碼?

回答

11

好天哪。我本來期望能夠工作。這可能是VBScript屬性獲取器實現中的一個錯誤,這會使其成爲我的錯。對於那個很抱歉。

由於最後一位接觸該代碼的人是我在1998年,我不希望有一個修復即將在即。

-1

您的問題是在這條線:

t.foo

你的Test2類沒有一個方法名爲foo( 「你好,世界!」)。你是什​​麼意思做,這是:

t.foo.bar =「你好,世界!」

你的代碼也是不完整的。除非你打算將你的屬性設置爲只讀,否則你也應該指定setters。

+0

我不確定你在說什麼。這是一個最小的測試用例,不是實用的代碼。這些屬性的存在只是爲了證明我所得到的行爲,這與setters沒有任何關係。 – 2011-04-20 05:31:14