Создание нового объекта

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Создание нового объекта

Сообщение GLEB » 14.05.2006 (Вс) 15:56

Может быть этот вопрос уже много раз задавался, но просто нет времени искать. Заранее извиняюся еси это так.

Код: Выделить всё

Dim C1 as New MyClass
Dim C2 as New MyClass

Sub SetC2C1
   Set C2 = C1
End Sub


Используя вот это, передается только ссылка на объект С1.
А как создать новый объект С2 независимый от С1 и присвоить ему все содержимое С1, разумеется не прибегая к поэлементному присваиванию.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.05.2006 (Вс) 16:02

Разумеется прибегая.
А ты как думал?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.05.2006 (Вс) 16:05

А если в классе куча свойств и подклассов :shock:
Это только в VB так или во всех языках :?: :shock:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2006 (Вс) 16:12

За все языки не скажу, но, например в Жаве так же.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.05.2006 (Вс) 16:38

Разумеется, у многих готовых объектов можно лицезреть метод Clone(). Но угадай, что у него внутри?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.05.2006 (Вс) 16:41

Понятно. :cry:

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.05.2006 (Вс) 19:06

GSerg писал(а):Разумеется прибегая.
А ты как думал?

А если внутри класса переменные Private, как к ним обратиться?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.05.2006 (Вс) 19:17

подсказка:

GSerg писал(а):Разумеется, у многих готовых объектов можно лицезреть метод Clone(). Но угадай, что у него внутри?
Изображение

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 14.05.2006 (Вс) 19:21

Насколько я знаю, это уже называется инкапсуляция. И делается для защиты данных. Не знаю точно, но скорее всего, никак. Если, что поправьте меня.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.05.2006 (Вс) 19:22

Не понял.
Допустим:
MyClass.cls
Код: Выделить всё
  Public   A as integer
  Private B as integer

  Public Sub Clone(c as MyClass)
    c.A = A
    ' Ну а как B передать?

  End sub

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 14.05.2006 (Вс) 19:31

А зачем ее передавать? Обычно переменные в классах ставятся, как Private для "внутреннего пользования". По крайней мере я так обычно делаю. Да, и в книжке Страуструпа так написано. Хотя она и по С++, но принципиальной разницы в этом нету. Там классы, просто очень хорошо описаны.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.05.2006 (Вс) 19:32

Ну а как еще создать идентичный объект?
Мне как раз и надо передать все переменные как Public так и Private.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.05.2006 (Вс) 22:50

У тебя какие-то явные проблемы с логикой.
Во-первых, абсолютную копию объекта создать невозможно в принципе.
И кроме того, зачем копировать Private-переменные?
Для всяких служебных целей можно юзать Friend-процедуры (Friend Sub Set_Var_B(Value_B)).
Lasciate ogni speranza, voi ch'entrate.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 15.05.2006 (Пн) 6:10

Ну допустим такая ситуация.
MyClass.cls

Private Model as MyModel

Sub LoadModel(file as string)
Model...
End Sub

Sub Draw()
Model...
End Sub

Все действия с переменной Model производятся внутри класса.

Может я чего-то недопонимаю, напишите кто знает метод Clone() для данного класса.

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 15.05.2006 (Пн) 8:44

GLEB писал(а):А если в классе куча свойств и подклассов :shock:
Это только в VB так или во всех языках :?: :shock:


На этот вопрос ответ тебе находится в прикрепленном файле. Правда, это только относится, к C++. Если внимательно прочитаешь, то разберешься, может быть.
Вложения
about_class.zip
Кусок из книги Страуструпа
(5.57 Кб) Скачиваний: 18
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 15.05.2006 (Пн) 11:56

Oxygen
Спасибо, почитаю на досуге.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.05.2006 (Пт) 16:50

Можно написать процедуру для копирования Public свойств любого класса. Но с сабклассами будет сложнее. Если есть способ создать New объект имея имя класса в переменной String то можно создать универсальную функцию, для копирования с сабклассами.

В Reference надо подгрузить TLBINF32.DLL

Код: Выделить всё
Private Sub CopyClass(ByRef Source As Object, ByRef Destination As Object)
Dim TLI As New TLIApplication
Dim TI As TypeInfo, i As Long, iMAX As Long, V As Variant, j As Long

Set TI = TLI.InterfaceInfoFromObject(Source)

iMAX = TI.Members.Count
For i = 1 To iMAX
    If TI.Members(i).Parameters.Count = 0 And TI.Members(i).InvokeKind = INVOKE_PROPERTYGET Then
        On Error Resume Next
        V = CallByName(Source, TI.Members(i).Name, INVOKE_PROPERTYGET)
        Call CallByName(Destination, TI.Members(i).Name, INVOKE_PROPERTYPUT, V)
        On Error GoTo 0
    End If
Next
End Sub
Программисты не глючат - глючат компиляторы...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.05.2006 (Пт) 17:02

CodeName33, ты таки не в теме...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.05.2006 (Пт) 17:05

GSerg, я частично ответил на изначальный вопрос. Может пригодится...
Программисты не глючат - глючат компиляторы...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.05.2006 (Пт) 17:37

Видишь ли...
Если ты владелец класса, то создать копию гораздо проще прямым присваиванием всех мемберов. Потому что ты владелец, и ты имеешь доступ к friend и private.
Если же ты не владелец, то создать полную копию класса в общем случае невозможно в принципе. Никак. Вообще.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.05.2006 (Пт) 22:08

Ну если класс имеет только public member'ы и таких классов много и лениво к каждому писать функцию копирования и в дальнейшем менять её при изменении/добавлении member'ов - то можно использовать универсальную...
Программисты не глючат - глючат компиляторы...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.05.2006 (Сб) 16:08

Вот тебе класс. Полный код оного. Самый, самый простейший случай.

Код: Выделить всё
Option Explicit

Private mValue As Double

Private Sub Class_Initialize()
  mValue = Rnd * 1000
End Sub

Public Property Get Value() As Double
  Value = mValue
End Property


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

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 20.05.2006 (Сб) 16:12

GSerg, такого - не укажу. Но ведь классы бывают разные. Бывают случаи когда классы используются вместо типов (т.к. типы нельзя передавать в public функции форм и т.д.). Вот для таких классав и пожходит мой метод.
Программисты не глючат - глючат компиляторы...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 20

    TopList  
cron