Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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: создаешь библиотеку классов, компилишь их и потом пользуешь код навроде:

Set obj = CreateObject("ProjectName.ClassName";)

Ответить

Номер ответа: 6
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #6 Добавлено: 02.04.08 10:07
у меня есть возможность комбинирования двух объектов.

параметры первых двух складываются, и передаются свеже созданому объекту, после чего первые два уничтожаются

Set obj = CreateObject("ProjectName.ClassName";)


тут тоже надо объявить переменную 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
Рад помочь.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам