Страница: 1 |
Страница: 1 |
Вопрос: Помогите с классами
Добавлено: 31.03.08 15:13
Автор вопроса: KreAtoR
Подскажите, как можно оптимально динамически создать объект класса и динамически его уничтожить???
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #1
Добавлено: 31.03.08 22:08
Dim obj as ClassName
Set obj = new ClassName ' создание
Set obj = Nothing ' уничтожение
Номер ответа: 2
Автор ответа:
KreAtoR
Вопросов: 120
Ответов: 438
Профиль | | #2
Добавлено: 01.04.08 10:29
я говорил про динамически.
примерно должно быть так
public sub Create_Object(objName as String)
Dim objName as ClassName
Set objName = new ClassName
End Sub
Два вопроса.
1. уничтожиться ли объект при выходе из функции?
2. можно ли передать объекту имя таким путем?
Номер ответа: 3
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #3
Добавлено: 01.04.08 19:17
Не совсем понятно, что требуется...
Приведенный код даже не скомпилируется:
налицо попытка переобъявить переменную.
Если нужно создать объект, имея текстовую переменную с именем класса, то используем функцию CreateObject.
Номер ответа: 4
Автор ответа:
KreAtoR
Вопросов: 120
Ответов: 438
Профиль | | #4
Добавлено: 01.04.08 19:22
приведи пример как она работает, а то все не выходит, как мне надо
Номер ответа: 5
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #5
Добавлено: 01.04.08 22:01
Расскажи подробнее, как тебе надо, и потом уж я попробую тебе помочь..
Вкратце, по использованию CreateObject: создаешь библиотеку классов, компилишь их и потом пользуешь код навроде:
Номер ответа: 6
Автор ответа:
KreAtoR
Вопросов: 120
Ответов: 438
Профиль | | #6
Добавлено: 02.04.08 10:07
у меня есть возможность комбинирования двух объектов.
параметры первых двух складываются, и передаются свеже созданому объекту, после чего первые два уничтожаются
тут тоже надо объявить переменную obj глобально?
или рамять выдуляется автоматически под объект???
Номер ответа: 7
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #7
Добавлено: 02.04.08 15:35
Тогда тебе не нужен такой изврат с CreateObject.
Простейший пример:
Function Combine(obj1 As Class1, obj2 As Class2) As Class3
Dim obj3 As New Class3
' присваиваем новому объекту свойства из obj1 и obj2
' ...
' мочим старые объекты
Set obj1 = Nothing
Set obj2 = Nothing
' возвращаем из функции новый объект
Set Combine = obj3
End Function
' Где-то в коде...
Dim o1 As Class1
Dim o2 As Class2
' Где-то о1 и о2 создаются и инициализируются,
' а потом еще где-то...
Dim o3 As Class3
Set o3 = Combine(o1, o2)
Номер ответа: 8
Автор ответа:
KreAtoR
Вопросов: 120
Ответов: 438
Профиль | | #8
Добавлено: 02.04.08 16:49
смотрится красиво честно.
el-paso спасибо тебе за помощь.
Dim o3 As Class3
должна быть объявлена глобально, ведь иначе объект уничтожиться при выходе из функции.
а заранее знать какие объекты создаст пользователь и сколько не имею понятия, а забивать из за этого память тоже нет смысла.
думал сделать просто массив на такой случай, но потом обращаться к этому объекту тяжело.
Номер ответа: 9
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #9
Добавлено: 03.04.08 17:20
А, ясненько.. Почитай тогда про коллекции VB.
Очень полезная штука.
Можно делать красивые вещи потом, навроде:
Dim objs As New Collection ' глобальное хранилище объектов
' Где-то в коде инициализируются объекты
' После создания каждого объекта добавляем его в коллекцию с ключами-именами
' так:
Dim obj1 As Class1
Set obj1 = CreateObjectOne(Param1, Param2)
objs.Add obj1, "one" ' one - это ключ и имя объекта, к примеру
' или кодом покороче:
objs.Add CreateObjectTwo(Param3, Param4), "two"
' функция Combine могет теперь выглядеть примерно так:
Function Combine(name1 As String, name2 As String) As Class3
' получаем объектеги из коллекции
Dim obj1 As Class1: Set obj1 = objs(name1)
Dim obj2 As Class2: Set obj2 = objs(name2)
' новый объектег
Dim obj3 As New Class3
' ...
' мочим старые объекты
objs.Remove(name1)
objs.Remove(name2)
' новый добавляем в коллекцию и возвращаем из функции (если надо, конечно)
objs.Add obj3, "my_combined_obj"
Set Combine = obj3
End Function
' юзание функции Combine:
Combine "cool_object", "mega_object"
' или:
Dim hochu_object As Class3
Set hochu_object = Combine("cool_object", "mega_object"
Функции CreateObjectOne и CreateObjectTwo пишутся с возвратом только что созданного объекта, как и в Combine.
Там, где имя класса заранее определить невозможно можно юзать универсальный тип Object.
Вуот...
Номер ответа: 10
Автор ответа:
KreAtoR
Вопросов: 120
Ответов: 438
Профиль | | #10
Добавлено: 04.04.08 10:53
респект!!!!! большой тебе поклон. осталось только с коллекциями разобраться. я из еще так и не понял.
Номер ответа: 11
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #11
Добавлено: 04.04.08 15:09
Рад помочь.