Проблема со свойствами VBScript по умолчанию

Я прочитал статью Эрика Липперта о семантике свойств по умолчанию в 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 собственность и передает список аргументов. The foo свойство фактически не принимает список аргументов. The foo свойство возвращает объект типа Test2. Test2 есть свойство по умолчанию, bar. Это свойство по умолчанию принимает список аргументов.

это ошибка, или я неправильно понял семантику свойств по умолчанию или мой код?

2 ответов


ваша проблема в этой строке:

t.фу ("Привет, Мир!")

ваш класс Test2 не имеет метода с именем foo. То, что вы хотите сделать, это:

Т.фу.бар = "Привет, Мир!"

ваш код также неполон. Если вы не хотите, чтобы ваши свойства были доступны только для чтения, вы также должны назначить сеттеры.