2013-12-13 4 views
0

Я пытаюсь создать замену класса VB6 для класса Scripting.Dictionary из SCRRUN.DLL. Scripting.Dictionary имеет (среди прочего) метод «Ключи», который возвращает массив ключей и свойство «Item» для чтения/записи, которое возвращает элемент, связанный с ключом. Я смущен этим, потому что оба они кажутся дефолтами для класса. То есть:Несколько свойств/методов по умолчанию в классе VB6?

For Each X In MyDict 

эквивалентен:

For Each X In MyDict.Keys 

Что мне следует, что "ключи" является операцией по умолчанию для класса, но:

MyDict("MyKey") = "MyValue" 
MsgBox MyDict("MyKey") 

эквивалентен:

MyDict.Item("MyKey") = "MyValue" 
MsgBox MyDict.Item("MyKey") 

Который мне impli что «Item» - это операция по умолчанию для класса.

Я никогда раньше не создавал класс VB6, у которого была операция по умолчанию, поэтому, поняв это, я подумал, что, возможно, я могу определить несколько операций по умолчанию, если все они имеют разные подписи, что они делают: Ключи ноль, элемент getter принимает вариант, а элемент setter принимает два варианта. Но это, похоже, не разрешается: когда я использую «Инструменты/Атрибуты процедуры», чтобы установить функцию Keys по умолчанию, а затем я использую ее для установки свойства Item по умолчанию, IDE жалуется, что по умолчанию уже установлен.

Так что я думаю, что я не понимаю, что здесь фундаментальное. Что происходит в объекте Scripting.Dictionary, который позволяет ему действовать так, как если бы «Ключи» были по умолчанию в некоторых контекстах, но как будто «Item» является значением по умолчанию в других? И что бы это ни было, могу ли я сделать то же самое в VB6?

ответ

0

ОК, отвечая на свой вопрос: я еще не пробовал это, но я понимаю, что «Item» должен быть установлен по умолчанию, и что я должен добавить совершенно новую функцию под названием «NewEnum», которая выглядит примерно так: следующие (слегка модифицированный из примера в «Программирование Microsoft Visual Basic 6.0» Франческо балена в книге):

Public Function NewEnum() As IUnknown 
    Set NewEnum = m_Keys.[_NewEnum] 
End Function 

(где «m_Keys» представляет собой сборник, содержащий ключи), а затем использовать инструменты/Процедура Атрибуты, чтобы скрыть NewEnum и установить его ProcID на -4.

+0

@ У Bob77 есть хороший момент - на самом деле в справочнике программистов есть довольно много информации. Вы можете получить к нему доступ из документов, которые были отправлены с ним, или [онлайн] (http://msdn.microsoft.com/en-us/library/hh204616.aspx). –

-1

Scripting.Dictionary имеет грязный секрет:

Он не обрабатывает перечисление на всех, она возвращает большие уродливые Variant массивов и ваши For Each петель итерации над теми.

Это одна из причин, по которой словарь может быть гораздо менее эффективным, чем стандартная коллекция VB6.

+0

Нечетный взгляд на простой факт. – Bob77

+0

Ваш простой факт касается вопроса, который задают. –

+0

Отпечаток «Неизвестно» в ближайшем окне: https://gist.github.com/wqweto/7952402 – wqw

0

То, что вы наблюдаете, - это разница между элементом по умолчанию и перечислителем коллекции. Объект COM (включая классы VB6) может иметь оба.

Вы можете определить свойство по умолчанию для класса, просмотрев в обозревателе объектов крошечный синий глобус или слова «элемент по умолчанию» в описании (см. Contents of the Object Browser). Обозреватель объектов не будет идентифицировать метод перечислителя, но если вы посмотрите на определение интерфейса класса с использованием OLE View или TypeLib Browser (бесплатно, но требуется регистрация), то DispId будет 0xfffffffc или -4.

В своем классе вы можете пометить свойство по умолчанию, установив для параметра «ИД» в «Диалоговое окно« Атрибуты процедуры »значение« (по умолчанию) »(см. Making a Property or Method the Default). Вы уже указали шаги по настройке счетчика коллекции в своем собственном ответе, но вы также можете найти это в разделе «Руководство программиста» Creating Your Own Collection Class: The House of Bricks.

+0

На самом деле обозреватель объектов * действительно * показывает перечислитель. Вам просто нужно включить «показать скрытых членов». – Bob77

+0

@ Bob77 Да, но даже если вы смотрите на скрытые элементы, он специально не указывает, что он установлен как перечислитель. –

Смежные вопросы