Проблема со свойствами по умолчанию VBScript - PullRequest
9 голосов
/ 20 апреля 2011

Я прочитал статью Эрика Липперта о семантике свойств по умолчанию в 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 ]

11 голосов
/ 20 апреля 2011

Хорошо, черт возьми. Я бы ожидал, что это сработает. Вероятно, это ошибка в реализации методов получения свойств VBScript, из-за которой я виноват. Извините за это.

Поскольку последним, кто прикоснулся к этому коду, был я в 1998 году, я не ожидал, что исправление появится в ближайшее время.

0 голосов
/ 20 апреля 2011

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

t.foo («Привет, мир!»)

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

t.foo.bar = "Привет, мир!"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...