Запрещение повторного объявления класса.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Запрещение повторного объявления класса.

Сообщение Vovik » 10.04.2004 (Сб) 7:20

Можно ли как-нть отследить сколько раз объявляется переменная с типом моего класса? Мне б как-нть запретить это дело. :roll:
О... ещё вопр... а можно переменные объявлять с начальными значениями, как в С++? Например Public b As New DX = NULL? :roll:

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

Сообщение GSerg » 10.04.2004 (Сб) 9:06

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

sanches
El compañero
El compañero
 
Сообщения: 823
Зарегистрирован: 09.01.2003 (Чт) 3:58
Откуда: Р_О_С_С_И_Я ! (Питер)

Сообщение sanches » 10.04.2004 (Сб) 11:51

нассчет первого: можно прибегнуть к смешному методу: при инициализации класс проверяет некое значение в реестре (или в файле). Если значения нет, то это первый экземпляр и мы создаем такое значение, если есть, то экземпляр уже есть. А при выходе затираем значение.
Изображение

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 10.04.2004 (Сб) 13:09

не такой уж он и смешной.
я использую этот метод для получения уникльного имени классовой копии.( чтоб их различать, сортировать и удалять)
Вопрос, а можно но ли получить какое нибудь уникальное значение классовой копии??? ( типа hwnd? hdc) понятно что класс не имеет окна, но все же....

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 10.04.2004 (Сб) 13:12

GSerg писал(а):Нет (а зачем?) и нет (все в ноль).
Как зачем?
При объявлении DirectX он может быть не пуст, а мне хотелось сразу при объявлении его обнулять... :roll:

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Запрещение повторного объявления класса.

Сообщение codemaster » 11.04.2004 (Вс) 10:15

Vovik писал(а):Можно ли как-нть отследить сколько раз объявляется переменная с типом моего класса? Мне б как-нть запретить это дело. :roll: :


Ключевое слово: Static


Vovik писал(а):О... ещё вопр... а можно переменные объявлять с начальными значениями, как в С++? Например Public b As New DX = NULL? :roll:


В VB6 ты не можешь преопределить конструктор класса
Как выход пользовать фабрику классов

sanches
El compañero
El compañero
 
Сообщения: 823
Зарегистрирован: 09.01.2003 (Чт) 3:58
Откуда: Р_О_С_С_И_Я ! (Питер)

Сообщение sanches » 11.04.2004 (Вс) 16:49

а фабрика классов - это, извиняюсь, что :shock:?
Изображение

Fde
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.07.2002 (Пт) 17:35
Откуда: Sestroreck.spb.ru

Сообщение Fde » 15.04.2004 (Чт) 18:34

Функция выполняющая создание класса и его первичную реализацию, но не пренадлежащая ему. Т.е.
Код: Выделить всё
oNew = ClassFactory(constMyObject)

Более того, в ряде сложных случаев может потребоваться введение объекта-абстрактной фабрики для нормального анализа всех внешних параметров, влияющих на создание объекта.

P.S.: Забыл добавить, что для большей понятности связей часто удобно использовать иерархии классов, построенных на принципе реализации базового(ых) интерфейса(ов).

sanches
El compañero
El compañero
 
Сообщения: 823
Зарегистрирован: 09.01.2003 (Чт) 3:58
Откуда: Р_О_С_С_И_Я ! (Питер)

Сообщение sanches » 15.04.2004 (Чт) 21:10

так это ты про .НЕТ?
Изображение

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 15.04.2004 (Чт) 22:37

sanches писал(а):так это ты про .НЕТ?


Это про Vb6 . Особенно если проект большой и будет экспертиза проекта.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 16.04.2004 (Пт) 0:16

а можно пример где ЭТО используется??
Код: Выделить всё
oNew = ClassFactory(constMyObject)

Fde
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.07.2002 (Пт) 17:35
Откуда: Sestroreck.spb.ru

Сообщение Fde » 16.04.2004 (Пт) 9:38

Данный пример абстрактный. Вот реальный код:
Код: Выделить всё
Private Function IIntegrationBuilder_GetIntegrationRules() As classIntegrationRule
    Set oRule = New classIntegrationRule
   
    oRule.Groups.Add 0, "Договор"
    oRule.Groups.Add 0, "Приложение"
   
    oRule.InSignalsGroups.Add "Договор", "2"
    oRule.InSignalsGroups.Add "Договор", "14"
    oRule.InSignalsGroups.Add "Приложение", "4"
    oRule.InSignalsGroups.Add "Приложение", "5"
   
    Set IIntegrationBuilder_GetIntegrationRules = oRule
End Function

Это начинка конкретного bilder'а

А вот его использование:
Код: Выделить всё
Set oRule = oBuilder.GetIntegrationRules


Использован принцип взаимозаменяемой абстрактной фабрики. Могу кинуть еще примеров, если надо.
Кстати, а какого рода примеры интересуют?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.04.2004 (Пт) 11:18

В VB это назвается имплементацией и использовать можно с замечательным словом Implements Class1, например, в заголовке Class2 будет обозначать наследование всех описателей класса 1

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.04.2004 (Пт) 13:55

Konst_One писал(а):В VB это назвается имплементацией и использовать можно с замечательным словом Implements Class1, например, в заголовке Class2 будет обозначать наследование всех описателей класса 1



Имплементация и фабрика классов разные вещи.
В VB6 из наследования можно реализовать только агрегирование.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 16.04.2004 (Пт) 14:56

to Fde
>>>>>Могу кинуть еще примеров, если надо.
кинь пожалуста
интерисуют примеры

Имплементация
фабрика классов
с наследованием

Вообще интерисуют красивые примеры.
С 98 года пишу на VB и только последние 2 года начал понимать что нихрена не понимаю в программировании.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.04.2004 (Пт) 15:06

2 codemaster Это как рассмаривать. ты рассматриваешь это с точки зрения java/c , а в VB - Implements именно для того, о чем спрашивал первый товарищ. чтобы можно было создать класс на основе другого

Fde
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.07.2002 (Пт) 17:35
Откуда: Sestroreck.spb.ru

Сообщение Fde » 16.04.2004 (Пт) 15:44

Konst_One писал(а):В VB это назвается имплементацией и использовать можно с замечательным словом Implements Class1, например, в заголовке Class2 будет обозначать наследование всех описателей класса 1


Реализация интерфейса у меня в классе была использована для другого. Просто я выбрал пример из компонента на требуемую тему, но там попалась имплементация.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.04.2004 (Пт) 15:52

Konst_One писал(а):2 codemaster Это как рассмаривать. ты рассматриваешь это с точки зрения java/c , а в VB - Implements именно для того, о чем спрашивал первый товарищ. чтобы можно было создать класс на основе другого


Нет никакого рассмотрения
с точки зрения java/c

То о чем ты пишешь называется Наследование интерфейса

В VB6 нет никакого наследования реализации иными словами
ты не можешь создать класс на основе другого!!!


P.S. Ну почитайте книги в конце концов . В есть MSDN целая статья .

Fde
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.07.2002 (Пт) 17:35
Откуда: Sestroreck.spb.ru

Сообщение Fde » 16.04.2004 (Пт) 16:01

Fedorfx писал(а):
Имплементация
фабрика классов

Давай я лучше тебе мылом кину компонент из которого я брал предыдущий пример. Там все это вместе используется вполне органично. Архив небольшой, а выложить пока мне некуда, да и смысла мало, так как он много внутренние библиотеки использует.

Если только идеи взять...

Fedorfx писал(а):
с наследованием

Наследование реализуется криво. Пример кидать не буду, ибо влом писать, а сам такой изврат почти не юзал.

В общем:
1) Создаем базовый класс
2) Создаем потомок с ключевым словом Implements <базовый клас>. то есть реализуем интерфейс базового класса.
3) Объявляем приватный экземпляр базового класса и переадрессуем на него все вызовы базового интерфейса (ну и при необходимости довешиваем код).

Fedorfx писал(а):Вообще интерисуют красивые примеры.

Кинь эталон красивости кода
:wink:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.04.2004 (Пт) 16:06

Могу не согласиться. Как раз я могу создать класс на основе своего другого класса и это и будет полиморфизм. Но я ничего не знаю о так называемом наследовании реализации.

Код: Выделить всё
'Class1
public property Get MyProperty() as string
MyProperty="myproperty"
end property

'Class2
Implements Class1

public property Get MyProperty() as string
'
end property

public Property Get MyPropertyNext() as long
MyPropertyNext=2
end property


Вот тебе и весь сказ.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 16.04.2004 (Пт) 23:36

to Fde
>>>Давай я лучше тебе мылом кину компонент из которого я брал предыдущий пример.

Заранее спасибо

а по поводу красивого кода - этоя имелл ввиду красивые (небычные) решения повседневных задач.
Для меня нижеприведенный код достаточно красив. :-)
Код: Выделить всё
Dim dd(1000) as double
dd(0)=1
CopyMemory dd(1), dd(0), ubound(dd)*4
dd(0)=2

sanches
El compa&#241;ero
El compa&#241;ero
 
Сообщения: 823
Зарегистрирован: 09.01.2003 (Чт) 3:58
Откуда: Р_О_С_С_И_Я ! (Питер)

Сообщение sanches » 16.04.2004 (Пт) 23:47

странно, у меня есть книжка от Microsoft. Про Implements там все сказано и вообще про ООП там есть, но никих упоминаний о какой-то фабрике.

И я кстати так и не понял, что же это за зверь такой и чем он лучше имплемента? (зы Вопрос немного корявый, но суть в этом)
Изображение

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 18.04.2004 (Вс) 20:03

Konst_One писал(а):Могу не согласиться. Как раз я могу создать класс на основе своего другого класса и это и будет полиморфизм. Но я ничего не знаю о так называемом наследовании реализации.


Мда... а код .......
Нет слов !!!

Для справки: реализация полиморфизма в VB6 без имплементов
Код: Выделить всё
'------------Class 1------------
Public Function GetName() As String
GetName = "Class1"
End Function

Private Sub Class_Terminate()
Debug.Print "Class1_Terminate "
End Sub
'------------Class 2------------

Public Function GetName() As String
GetName = "Class2"
End Function

Private Sub Class_Terminate()
Debug.Print "Class2_Terminate "
End Sub

'--------  тест----------
Private Sub pTest()

Dim i As Integer
Dim objArr(1) As Object
'
Set objArr(0) = New Class1
Set objArr(1) = New Class2
'
For i = 0 To UBound(objArr)
    ' собственно полиморфизм
    Debug.Print objArr(i).GetName
Next i
'<-- попоробуйте закомент. Erase objArr и см.
'Class_Terminate классов

Erase objArr

'
End Sub


замечания и критика принимается :wink:

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

Сообщение GSerg » 19.04.2004 (Пн) 10:25

Замечания:
Зачем комментировать erase?
С ним:
Код: Выделить всё
Class1
Class2
Class1_Terminate
Class2_Terminate

Без него:
Код: Выделить всё
Class1
Class2
Class1_Terminate
Class2_Terminate


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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.04.2004 (Пн) 10:39

Прлностью согласен с GSerg!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 19.04.2004 (Пн) 10:55

GSerg писал(а):Замечания:
Зачем комментировать erase?
С ним:
Код: Выделить всё
Class1
Class2
Class1_Terminate
Class2_Terminate

Без него:
Код: Выделить всё
Class1
Class2
Class1_Terminate
Class2_Terminate


Критика:
Это не полиморфизм. Это два абсолютно не связанных объекта, которые абсолютно случайно имеют методы, называющиеся одинаково.



Здравствуйте !!!! Приехали !!!!

Ну что поговорим о IDispatch , vTable раннем и позднем связывании !!!! ????

'Зачем комментировать erase?
смотрим где возникает ClassX_Terminate

P.S. Берем книгу и читаем определение полиморфизма.

Fde
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.07.2002 (Пт) 17:35
Откуда: Sestroreck.spb.ru

Сообщение Fde » 19.04.2004 (Пн) 12:21

sanches писал(а):странно, у меня есть книжка от Microsoft. Про Implements там все сказано и вообще про ООП там есть, но никих упоминаний о какой-то фабрике.


sanches писал(а):И я кстати так и не понял, что же это за зверь такой и чем он лучше имплемента? (зы Вопрос немного корявый, но суть в этом)


rtfm BO4 (если не в курсе, то книга называется "Приемы объектно ориентированного проектирования.Патерны проектирования.")

Этот зверь дополняет имплемент, то бишь дает простой способ генерации конкретных объектов для абстрактных интерфейсов.

Fde
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 12.07.2002 (Пт) 17:35
Откуда: Sestroreck.spb.ru

Сообщение Fde » 19.04.2004 (Пн) 12:23

codemaster писал(а):
Ну что поговорим о IDispatch , vTable раннем и позднем связывании !!!! ????

'Зачем комментировать erase?
смотрим где возникает ClassX_Terminate

P.S. Берем книгу и читаем определение полиморфизма.


Зачем так глубоко зарываться? Ведь есть еще и Object, но, имхо, изначально тема была о том как максимально определить до компиляции все типы интерфейсы и т.д.


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 26

    TopList  
cron