Хотел бы услышать ваше мнение насчет применения ООП в VBA.
В связи с частым использованием многих функций, хотел собрать их в один объект, дабы было удобно использовать, пример:
Dim x As New nerv ' имя класса - мой ник : ) Dim col As New Collection
' пример использования - формирование строки из коллекции MsgBox nerv.Collection.toString(col)
' формирование массива из коллекции arr = nerv.Collection.toArray(col)
Я уж молчу про то, что нельзя сделать просто и очевидно - добавить свои методы/свойства к предопределенным объектам: MsgBox col.toString() arr = col.toArray()
но, вам не кажется, что добавлять модуль класса, просто для того, чтобы там написать Public Collection As New Collection_ - лишним?
Это только верхушка айсберга: почему приватные поля класса видны при создании объекта в отладчике? Они ж приватные! При обращении к ним возникает ошибка. Дядя, Бил, ты перемудрил.
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
По-моему, синтаксис должен быть нескольлько другой:
Dim x As New nerv ' имя класса - мой ник : ) Dim col As New Collection
' пример использования - формирование строки из коллекции MsgBox x.CollectionToString(col) 'CollectionToString - название метода
' формирование массива из коллекции arr = x.CollectionToArray(col) 'CollectionToArray - название метода
> но, вам не кажется, что добавлять модуль класса, просто для того, чтобы там написать Public Collection As New Collection_ - лишним?
А зачем это делать? Коллекция объявлена и заполняется в обычном модуле, потом передается как аргумент методу класса nerv, который ее обрабатывает.
> Я уж молчу про то, что нельзя сделать просто и очевидно - добавить свои методы/свойства к предопределенным объектам
В VBA есть механизм наследования - с помощью оператора Implements. Я никогда его не использовал, но, наверно, можно создать класс NervCollection, который унаследует свойства и методы коллекции и добавит свои. Попробуй :)
>По-моему, синтаксис должен быть нескольлько другой: >MsgBox x.CollectionToString(col) 'CollectionToString - название метода Логику понял, но это не совсем то, что я хотел, т.к. кроме коллекции, планирую еще другие доп. функции насувать ) Т.е. мой ник как namespace (пространство имен), которое "подразделяется" на подструктуры, а-ля дерево каталогов.
>В VBA есть механизм наследования - с помощью оператора Implements. Я никогда его не использовал, но, наверно, можно создать класс NervCollection, который унаследует свойства и методы коллекции и добавит свои. Попробуй :) можно пример?
>А зачем это делать? Коллекция объявлена и заполняется в обычном модуле, потом передается как аргумент методу класса nerv, который ее обрабатывает. если честна, хотел бы этого избежать, т.е. вызывать методы напрямую - коллекция.метод, т.е. способ collection.toString() - предпочтительный
>После ввода точки выпадает только "x" и "pubs". в окне локалс
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
Представляю вашему вниманию расширенный класс Collection. На данный момент он включает:
Add - стандартный нативный метод AddUnique - новый метод Count - стандартное нативное свойство Item - расширенный стандартный метод Remove - расширенный стандартный метод RemoveAll - новый метод Sort - новый метод ToArray - новый метод ToString - новый метод
Более подробно ниже и в файле. Проверить в файле.
'=================================== ' Данная коллекция (Collection_) включает как стандартные (расширенные) _ методы и свойства, так и добавленные (надеюсь, полезные). '===================================
' Расширенные св-ва/методы: ' 1. Remove - возвращает удаленное значение _ (в стандартной коллекции он просто удаление). _ Пример:
col.Add True x = col.Remove(1) ' <-- Stop
'-----------------------------------
' 2. Item - позволяет не только читать, но и _ записывать значения (в стандартной реализации _ только чтение). Пример:
' добавляем значения, так же как и в нативную коллекцию col.Add 1 col.Add 2
2. Теперь нельзя использовать метод Remove как стандартный - обязательно надо присваивать его значение какой-то переменной. ИМХО это неудобно. Можно либо оставить прежный метод как стандартный и создать новый метод RemoveA, который возвращает удаленное значение, либо переименовать метод в функцию Public Function Remove(ByRef Index As Variant) As Variant Почему-то функцию можно использовать как процедуру, не используя возвращаемое значение, а свойство - нельзя.
3. Интересно было бы иметь сортировку и по ключам, и по значениям.
> 3. Как? В ключах вся загвоздка. Ключ можно добавить, но не прочитать. Да. Есть вариант всегда добавлять в коллекцию пару значений: this.Add array(item, key), key Или параллельно вести еще одну коллекцию, у которой item равен ключу основной коллекции.
> что бы еще добавить? Хорошо бы иметь возможность неявно добавлять несуществующий элемент, как у словаря. Например, команда dic(q)=dic(q)+1 увеличит элемент с ключом q на 1, а если такого элемента нет, то добавит элемент с ключом q и в результате этот элемент будет содержать 1. Без возникновения ошибки. Тогда, наверно, придется добавить и проверку существования элемента Exists.
Все эти навороты, однако, сводят на нет основную прелесть коллекции - высокую скорость работы.
>Все эти навороты, однако, сводят на нет основную прелесть коллекции - высокую скорость работы. да не. Нативные методы написаны максимально просто/быстро. Или ты думаешь, от того, что ты напишешь (к примеру) отдельную функцию/процедуру для преобразования коллекции в строку, она будет работать быстрее? )
Итого: Add - стандартный нативный метод AddUnique - новый метод Count - стандартное нативное свойство Exists - новый метод Item - расширенный стандартный метод Remove - расширенный стандартный метод RemoveAll - новый метод Sort - новый метод ToArray - новый метод ToString - новый метод
В архиве xls, в котором можно проверить как оно работает, а также cls, который можно подключать сразу к проекту.
> Нативные методы написаны максимально просто/быстро. Или ты думаешь, от того, что ты напишешь (к примеру) отдельную функцию/процедуру для преобразования коллекции в строку, она будет работать быстрее?
Время тратится на передачу параметров через методы объекта. То есть с коллекцией в обычном модуле работать быстрее, чем с коллекцией в классе. Как-то я сравнивал время доступа к переменным в классе и к локальным переменным. Интересно, что тема называлась так же, как эта :))
>Интересно, что тема называлась так же, как эта :)) ^_^
>Можно ли использовать методы класса внутри его самого сразу ответ - можно )
>Время тратится на передачу параметров через методы объекта. Даже не собираюсь спорить. Обертки кушают, но немного. Ситуация двоякая: с одной стороны удобство использования, с другой скорость выполнения. Я бы с удовольствием унаследовал почти все родные методы, но VBA отказал. Поэтому акробатика )
Здесь Range(...) тоже время тратиться, но простота использования - ключевой момент.
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук