Понемногу погружаюсь в фреебейсик, возникают вопросы по синтаксису и правильной работе с конструкциями языка.
Первую очередь по работе с классами хочу уточнить.
1. Объявляю и описываю класс с данными, конструктором, деструктором, методами, как правильно создавать и уничтожать объект данного класса? Когда надо так:
Код
'Создали экземпляр класса dim ExzemplarClassa as StringList Ptr=new StringList() 'Уничтожили экземпляр класса ExzemplarClassa->destructor() Delete ExzemplarClassa
А когда достаточно так:
Код
dim ExzemplarClassa as StringList 'Ptr=new StringList() 'Создали экземпляр класса ExzemplarClassa.destructor() 'Уничтожили экземпляр класса
Как во втором случае обнулить саму переменную класса?
2. Есть ли возможность прописать предварительное объявление класса и как это сделать? Что бы вышеобъявленный класс мог включать объекты ниже объявленного класса?
1. Объявляю и описываю класс с данными, конструктором, деструктором, методами, как правильно создавать и уничтожать объект данного класса?Когда надо так:
Код 'Создали экземпляр класса dim ExzemplarClassa as StringList Ptr=new StringList() 'Уничтожили экземпляр класса ExzemplarClassa->destructor() Delete ExzemplarClassa
А когда достаточно так:
Код dim ExzemplarClassa as StringList 'Ptr=new StringList() 'Создали экземпляр класса ExzemplarClassa.destructor() 'Уничтожили экземпляр класса
Как во втором случае обнулить саму переменную класса?
Тебе нужно понимать принципы создания переменных , их время жизни в программе.
при объявлении:
Код
dim P as Byte
переменная живет , пока существует область видимости , в которой переменная была объявлена. Когда по логике работы программы , область видимости станет несуществующей , тогда переменная будет удалена автоматически. Ты не сможешь ее удалить , это привилегия компилятора. Например в функции , в скопе , в конструкторе , в блоке цикла и т.п. , сделав такое объявление , переменная будет жить , пока программа находится в данном блоке.
Ответь, не запуская код , сколько будет напечатано в консоли?
Код
for i as integer = 0 to 5
dim P as Byte
P+=10
next
Print P
при объявлении:
Код
dim P as Byte ptr = new Byte
или:
Код
dim P as Byte ptr = allocate(1)
переменная будет жить пока не удалить ее вручную с помощью delete
ЦитатаТестор ()
2. Есть ли возможность прописать предварительное объявление класса и как это сделать? Что бы вышеобъявленный класс мог включать объекты ниже объявленного класса?
Ответь, не запуская код , сколько будет напечатано в консоли?
Переменная объявленная в цикле не существует за его пределами?
Да, действительно я работал с переменными как с чёрным ящиком и смутно представляю как они устроены и "живут", потому я об этом и спросил. В паскале я знал что простыми типами данных управлять не надо, а для классов сушествовал метод креате для создания объекта, и фрее для его уничтожения, это логически отделяло для меня цикл его жизни и мне не приходилось задуматься почему это так.
Код
dim ExzemplarClassa as StringList 'Ptr=new StringList() 'Создали экземпляр класса ExzemplarClassa.destructor() 'Уничтожили экземпляр класса
Так предлагалась в справочнике, я проверил оно работает... но сомнения остались, всё ли я сделал. Компилятор этим занимается. ну пускай, я только за
Сообщение отредактировал Тестор - Среда, 04.04.2018, 18:54
Переменная объявленная в цикле не существует за его пределами?
Правильно понимаешь , но еще правильнее: компилятор не даст такой программе скомпилироваться (выдаст ошибку).
А если строку Print P переместить перед строкой Next , сколько покажет консоль? Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
будет переинициировать переменную на каждом цикле?
Что в твоем понимании слово "переинициировать"? Я не просто так спрашиваю , потому что твой вопрос противоречит ответу:
Цитата
Ну тогда 6 раз по 10, нет то числа от 10 до 60.
Далее:
Цитата
'Уничтожили экземпляр класса ExzemplarClassa->destructor()
Это что такое? И где ты откопал такой код? Ты понимаешь принцип работы конструкторов\деструкторов? Ты всерьез считаешь , что вызвав деструктор , уничтожается объект класса автоматически? Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Что в твоем понимании слово "переинициировать"? Я не просто так спрашиваю , потому что твой вопрос противоречит ответу:
Я не представляю что там происходит с памятью, но догадываюсь что объявление одной и той же переменной будет присваивать ей значение по умолчанию
Цитатаhaav ()
Ты понимаешь принцип работы конструкторов\деструкторов? Ты всерьез считаешь , что вызвав деструктор , уничтожается объект класса автоматически?
У меня этот код правда вот так выглядел:
Код
'Уничтожили экземпляр класса ExzemplarClassa->destructor() Delete ExzemplarClassa
Где я его откопал... я сейчас заколебусь искать, но это действительно не моё изобретение, накануне вечером перед тем как запостить эту тему я пытался найти описание правил создания и уничтожения объектов во фреебасике... и где то я нашёл упоминание что вызвать делет недостаточно.
Что касается моих представлений о классах, опять таки я не вникал глубоко в механнику их работы, а изучал только как ими пользоваться. Что я знаю о конструкторах/деструкторах, первый вызывается при создании, второй при уничтожении, объект класса не может уничтожить себя, для этого нужен внешний инициатор или в его роли отсроченный вызов (если что за терминологию пардон). Потому я и вопрос запостил, однозначного описания правил создания/уничтожения не нащёл, фундаментального понимания по данному предмету не имел - оно бы было иначе, дак и вопрос задавать не пришлось, так что поясни как надо, буду признателен.
Слушай, уточню вдогонку... я правильно понял, что если я объявил указатель вот так:
Код
dim zag_ as GtkWidget ptr
Я обязательно должен буду по завершению его использования вызвать:
Код
Delete zag_
Да и ещё, вот это нижнее подчёркивание в конце имени переменной указателя, это правила хорошего тона для объявления указателей? Подсмотрел в твоём примере по ГТК3.
Ещё до одного вопроса дозрел... я не знаю как создать "сигнал", "событие"... когда к классу можно привязать внешний метод и клас его будет вызывать при наступлении некого события, когда например курсор защёл на кнопку, нажатие, ресайз и т. д. Как это реализуется средствами фреебасика?
Сообщение отредактировал Тестор - Среда, 04.04.2018, 21:45
Я не представляю что там происходит с памятью, но догадываюсь что объявление одной и той же переменной будет присваивать ей значение по умолчанию
Точно! И значение по умолчанию в FB равно нулю. То есть dim P as Byte будет обозначать выделение памяти для переменной и присваивание ей нуля. А если ты понимаешь , что ей присваивается значение по умолчанию , то почему тогда ты даешь такой ответ? :
Цитата
Ну тогда 6 раз по 10, нет то числа от 10 до 60.
Как видишь, твой метод экспресс обучения не сильно тебе помогает. И если бы ты банально прочел учебник (пусть он и не идеальный), то на многие бы вещи смотрел бы по другому.
Цитата
Что касается моих представлений о классах, опять таки я не вникал глубоко в механнику их работы, а изучал только как ими пользоваться. Что я знаю о конструкторах/деструкторах, первый вызывается при создании, второй при уничтожении, объект класса не может уничтожить себя, для этого нужен внешний инициатор или в его роли отсроченный вызов (если что за терминологию пардон). Потому я и вопрос запостил, однозначного описания правил создания/уничтожения не нащёл, фундаментального понимания по данному предмету не имел - оно бы было иначе, дак и вопрос задавать не пришлось, так что поясни как надо, буду признателен.
Да точно, конструкторы\деструкторы вызываются , но их не вызывают! Чтобы ты понимал , конструкторы\деструкторы - это такие же функции , но вызываются автоматически. То есть твой код бред, но он мог иметь место в языке до появления ООП (либо вообще в другом языке , где ключевое слово destructor не зарезервировано):
Код
'Уничтожили экземпляр класса ExzemplarClassa->destructor() Delete ExzemplarClassa
Чисто технически компилятор , анализируя код , вставляет вызов деструктора (читай функции) прямо перед вызовом Delete ExzemplarClassa . А уж что ты там напишешь во внутренностях деструктора , на это компилятору чихать (конечно же в рамках правил синтаксиса языка) . Так же обстоит дело с конструктором. Только там компилятор вставляет вызов конструктора сразу после создания объекта.
Цитата
Слушай, уточню вдогонку... я правильно понял, что если я объявил указатель вот так:
Код dim zag_ as GtkWidget ptr
Я обязательно должен буду по завершению его использования вызвать:
Код Delete zag_
Нет. Оператор Delete работает в тандеме с оператором New. Так же как оператор Allocate\Callocate работает в тандеме с Deallocate.
Цитата
Да и ещё, вот это нижнее подчёркивание в конце имени переменной указателя, это правила хорошего тона для объявления указателей? Подсмотрел в твоём примере по ГТК3.
Нет , это плохой тон, однако мне это сэкономило время при переписывании исходника с СИ. Чтобы ты понимал , слово window зарезервировано в FB и его нельзя использовать для имен переменных. Поэтому я по шустрому впендюрил подчеркивание Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Да я действительно не проверял код, и я догадывался, но не был окончательно уверен )))
Цитатаhaav ()
Как видишь, твой метод экспресс обучения не сильно тебе помогает.
Я не говорил что безупречный, бескомпромиссность это идеализм. Но в учебнике этом я на самом деле регулярно пасусь.
С вот этим то же подскажи пожалуйста:
Цитата
Ещё до одного вопроса дозрел... я не знаю как создать "сигнал", "событие"... когда к классу можно привязать внешний метод и клас его будет вызывать при наступлении некого события, когда например курсор защёл на кнопку, нажатие, ресайз и т. д. Как это реализуется средствами фреебасика?
У меня целевая наработка сейчас по гуям на гтк, но там пока полны срачь - просто эксперименты. Тут родилась побочная демка, продукт освоения синтаксиса языка, класс стринглист, плоский список строк, построен на массиве. типовые методы. Покритикуй. Правда я пока не разобрался с поддержкой юникода..., так что у меня он тока крякозябрит.
Код
''===================================================================================================='' ''===================================================================================================='' '' РАЗДЕЛ ОБЪЯВЛЕНИЙ ''===================================================================================================='' ''====================================================================================================''
''=================================================='' '' Класс: Список строк ''==================================================''
Type StringList Private: Dim MList(Any) as String Public: declare constructor() Declare Const Function Count() As ULongInt Declare Sub ClearList() Declare Sub AddItem(Byval v_String As String) Declare Sub AddItemToIndex(Byval v_ToIndex As ULongInt,Byval v_String As String) Declare Sub DellItem(Byval v_Index As ULongInt) Declare Property Item(Byval v_Index As ULongInt) As String Declare Property Item(Byval v_Index As ULongInt,Byval v_String As String) Declare Sub InitSegment(Byval v_SizeSegment As ULongInt) Declare Sub DellSegment(Byval v_IndexStart As ULongInt,Byval v_IndexStop As ULongInt) Declare Sub UpItem(Byval v_Index As ULongInt) Declare Sub DownItem(Byval v_Index As ULongInt) Declare Sub MoveItemToIndex(Byval v_IndexItem As ULongInt,Byval v_ToIndex As ULongInt) declare destructor() End Type
''===================================================================================================='' ''===================================================================================================='' '' РАЗДЕЛ МЕТОДОВ ''===================================================================================================='' ''====================================================================================================''
''=================================================='' ''=================================================='' '' МЕТОДЫ КЛАССА: СПИСОК СТРОК ''=================================================='' ''==================================================''
''=================================================='' '' Метод: Конструктор класса ''=================================================='' constructor StringList() Redim MList(-1) 'Очищаем массив end constructor
''=================================================='' '' Метод: Вернуть длину списка ''=================================================='' Function StringList.Count() As ULongInt Function=Ubound(MList)+1 End Function
''=================================================='' '' Метод: Очистить список ''=================================================='' Sub StringList.ClearList() Redim MList(-1) 'Очищаем массив End Sub
''=================================================='' '' Метод: Добавить элемент ''=================================================='' Sub StringList.AddItem(Byval v_String As String) Dim n As ULongInt=Ubound(MList)+1 Redim Preserve MList(n) As String MList(n)=v_String End Sub
''=================================================='' '' Метод: Добавить элемент ''=================================================='' Sub StringList.AddItemToIndex(Byval v_ToIndex As ULongInt,Byval v_String As String) if v_ToIndex<=Ubound(MList) then Redim Preserve MList(Ubound(MList)+1) As String Dim i As ULongInt=0 For n As ULongInt=v_ToIndex+1 To Ubound(MList) MList(Ubound(MList)-i)=MList(Ubound(MList)-i-1) i=i+1 Next MList(v_ToIndex)=v_String Else AddItem(v_String) EndIf End Sub
''=================================================='' '' Метод: Удалить элемент ''=================================================='' Sub StringList.DellItem(Byval v_Index As ULongInt) if v_Index<=Ubound(MList) then For n As ULongInt=v_Index+1 To Ubound(MList) MList(n-1)=MList(n) Next Redim Preserve MList(Ubound(MList)-1) As String EndIf End Sub
''=================================================='' '' Метод: Вернуть значение элемента ''=================================================='' Property StringList.Item(Byval v_Index As ULongInt) As String if v_Index<=Ubound(MList) then Property=MList(v_Index) else Property="" EndIf End Property
''=================================================='' '' Метод: Установить значение элемента ''=================================================='' Property StringList.Item(Byval v_Index As ULongInt,Byval v_String As String) if v_Index<=Ubound(MList) then MList(v_Index)=v_String EndIf End Property
''=================================================='' '' Метод: Инициировать сегмент элементов ''=================================================='' Sub StringList.InitSegment(Byval v_SizeSegment As ULongInt) Redim Preserve MList(Ubound(MList)+v_SizeSegment) As String End Sub
''=================================================='' '' Метод: Удалить сегмент элементов ''=================================================='' Sub StringList.DellSegment(Byval v_IndexStart As ULongInt,Byval v_IndexStop As ULongInt) if v_IndexStop<=Ubound(MList) and v_IndexStart<=v_IndexStop then Dim v_Delta as ULongInt=v_IndexStop-v_IndexStart+1 Dim i as ULongInt=0 For n As ULongInt=v_IndexStop+1 To Ubound(MList) MList(v_IndexStart+i)=MList(n) i=i+1 Next Redim Preserve MList(Ubound(MList)-v_Delta) As String EndIf End Sub
''=================================================='' '' Метод: Поднять элемент ''=================================================='' Sub StringList.UpItem(Byval v_Index As ULongInt) if v_Index>0 or v_Index<=Ubound(MList) then Dim v_String as String v_String=MList(v_Index-1) MList(v_Index-1)=MList(v_Index) MList(v_Index)=v_String EndIf End Sub
''=================================================='' '' Метод: Опустить элемент ''=================================================='' Sub StringList.DownItem(Byval v_Index As ULongInt) if v_Index<=Ubound(MList)-1 then Dim v_String as String v_String=MList(v_Index+1) MList(v_Index+1)=MList(v_Index) MList(v_Index)=v_String EndIf End Sub
''=================================================='' '' Метод: Переместить элемент ''=================================================='' Sub StringList.MoveItemToIndex(Byval v_IndexItem As ULongInt,Byval v_ToIndex As ULongInt) if v_IndexItem<=Ubound(MList) and v_ToIndex<=Ubound(MList) and v_IndexItem<>v_ToIndex then Dim v_String as String Dim i as ULongInt=0 v_String=MList(v_ToIndex) MList(v_ToIndex)=MList(v_IndexItem) if v_IndexItem>v_ToIndex then 'Перемещение элемента вверх по списку For n As ULongInt=v_ToIndex+1 To v_IndexItem if n<v_IndexItem then MList(v_IndexItem-i)=MList(v_IndexItem-i-1) i=i+1 Else MList(v_ToIndex+1)=v_String EndIf Next Else 'Перемещение элемента вниз по списку Dim k as ULongInt=v_ToIndex-1 For n As ULongInt=v_IndexItem To k if n<k then MList(v_IndexItem+i)=MList(v_IndexItem+i+1) i=i+1 Else MList(k)=v_String EndIf Next EndIf EndIf End Sub
''=================================================='' '' Метод: Деструктор класса ''=================================================='' destructor StringList() Erase MList 'Очищаем массив end destructor
Все сразу рвутся по-взрослому писать и потом мы видим 300 тысяч строк индус-кода и один большой вопрос - "что делать?" у людей, которые нанимают разработчиков, им даже фирмы с проф. прогерами не могут потом объяснить, что это полностью невалидный код и всё надо переписывать и что дебаг без документации - уже не поможет. Это называется ощути себя Вангой, без сарказма.
Тестор, коротко: изучить операторы, конструкции и ключевые слова языка (можно начать с QuickBasic), далее изучить методологию ООП(раз вы хотите кодить, используя её) и только потом приступать к GTK, причём желательно не к последнему. Без хотя бы одного из этих пунктов - пазл не сложится. Кстати чем паскаль не устроил? FreePascal - ЯП точно такого же ранга, юниты аппетитно подключаются, на ассемблере точно так же вставочками писать можно, указатели и ООП там тоже есть. "мене ни панимать"
Ещё до одного вопроса дозрел... я не знаю как создать "сигнал","событие"... когда к классу можно привязать внешний метод и клас его будет вызывать при наступлении некого события, когда например курсор защёл на кнопку, нажатие, ресайз и т. д. Как это реализуется средствами фреебасика?
Во первых , я уже писал , что с GTK3 я не работал. Что я могу тебе подсказать? Во вторых, я не гадалка. Напиши код, покажи что не получается , может кто нибудь подскажет. В третьих, постарайся задавать вопрос как можно проще, больше вероятности что поймут и ответят. Твой же вопрос выглядит примерно так:
Цитата
Oнo и кoнeчнo, oнo и пoнятнo, oнo и нe чтo-либo кaк, и нe кaк-либo чтo, a чтo кacaтeльнo oтнocитeльнo — тo и дeйcтвитeльнo
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
В третьих, постарайся задавать вопрос как можно проще, больше вероятности что поймут и ответят.
Это не касалось ГТК, для примера пытался привести..., касалось только конструкций Басика. Хорошо постараюсь выражаться яснее. Кажется я нашёл то что искал, если ошибаюсь попозже переформулирую вопрос.
DarkDemon, нет конечно спасибо за красочные примеры и советы, только... без обид, но тема что мне делать - это точно не тема данного форума, ровно как она не касается тебя. Я так понимаю, мы на форуме посвященном фреебасику, я конечно не демонстрирую глубинных познаний, но и от тематики не отклоняюсь..., информации о том, что есть некий ценз уровня знания языка для доступа на форум я не видел. Я это к тому, что на самом деле рад любому конструктивному общению, в особенности помощи по существу задаваемых вопросов, но субоколотемные ответы пространственного характера, с неособо адекватным эмоциональным окрасом и свербящей наивностью, мягко говоря не к месту. Это флуд на гране тролинга.
Что б не возвращаться к этой теме... тот уровень на котором я изучаю/использую программирование (в том числе бейсик), это не случайность, а осознанный выбор. Мои методы, мой подход уже не однократно обкатаны и проверены на практике, это принципы соотношение целей к время и трудо затратам, принцип достаточности. Какие ..лядь заказчики? Кто там претендует на валидатора моего кода? Если кто то претендует... это меня как то касается? Я из другой отрасли. Ты говоришь я не понимаю принципов ООП?... ну где то, со своего уровня ты наверное прав... (это что то для меня должно меняет?), я вот считаю, что я понимаю ООП на достаточном уровне, на уровне чёрного ящика, я не знаю, что там под капотом и почему это так, но я знаю, что оно мне даёт и как в общем с ним нужно обращаться... бинго, и вот это цель моих вопросов, я ранее использовал один чёрный ящик (потом ещё второй), теперь заинтересовался ещё одним, ну а у него "кнопочки, рычажки, педальки" оказались немного иначе сконфигурированы... возникли местами неуверенность, местами вопросы.
Пологаеш это такой неприемлемый подход? Но на самом деле, ты ведь каждый день им, вероятно не осознанно, пользуешься. Ты водишь машину? А ты закончил ВУЗ'ы технического, дорожностроительного и юридического профилей? Ты можешь разобрать до болтика и собрать современный автомобиль, знаешь всю историю и предтече от моторизированной коляски дядюшки Бенца до наших дней? Владеешь теохнологиями строительства дорог и объектов дорожной структуры, досконально изучим принципы и подходы конфигурации дорожной структуры? Ты владеешь исчерпывающими знаниями по правовыми аспектам данной сферы? Нет... только автошколу закончил?!!... Ты пользуешься лифтом даже не владея сопроматам? Пользуешься сотовым телефоном? А как же доскональное изучение корпускулярно-волновых явлений? И т. д. до бесконечности. А на самом деле, тебе просто нужно пообщаться с узкопрофильными специалистами, которые с позиции бога тебе обстоятельно "объяснят на 10 листах", что ты просто "задравши нос" лузер по жизни... и они тебя "мене ни панимать".
if *mn is TipeA then print "ДА" else print "НЕТ" endif End Sub
Dim test1 as TipeC
identify(@test1)
Возможно ли в методе "identify" помимо подтверждения о наследовании от корневого родителя установить является ли это "TipeB" или "TipeC" и обратиться к их уникальным полям?
Сообщение отредактировал Тестор - Понедельник, 09.04.2018, 21:47
Возможно ли в методе "identify" помимо подтверждения о наследовании от корневого родителя установить является ли это "TipeB" или "TipeC"
Да возможно. Проверять следует от самого младшего ребенка по цепочке к корневому родителю. Если брать пример, который ты привел, то проверка должна быть такой:
сначала проверяется на принадлежность объекта к классу TipeC , потом TipeB , потом TipeA.
Если у тебя будет объект класса TipeC , а ты сразу будешь проверять его принадлежность например к корневому классу TipeA , то он покажет принадлежность этому классу , что является ошибкой.
ЦитатаТестор ()
и обратиться к их уникальным полям?
Здесь есть некоторые "закорючки".
А именно, если поля классов имеют уникальные имена , то доступ к ним не представляет проблем. Например:
Код
type TipeA extends Object
p1 As Integer = 1 ' имя P1
End Type
type TipeB extends TipeA
p2 As Integer = 2 ' имя P2
End Type
type TipeC extends TipeB
p3 As Integer = 3 ' имя P3
End Type
Sub identify(ByVal n As Object Ptr)
if *n is TipeC Then
print "Object C"
? Cptr(TipeC Ptr, n)->p1
? Cptr(TipeC Ptr, n)->p2
? Cptr(TipeC Ptr, n)->p3
elseif *n is TipeB Then
print "Object B"
elseif *n is TipeA Then
print "Object A"
EndIf
End Sub
Dim test1 as TipeC
identify(@test1)
Sleep
А вот если названия полей будут иметь одинаковые имена... Здесь мне даже пришлось консультироваться у более грамотных ребят с оф. форума. В итоге получить к ним доступ можно только так (обрати внимание на приведение типов к нужному классу для доступа к его полям):
haav, спасибо, я немного не правильно обращался к полю и получал ошибку.
Всё таки вернусь к вопросу который не смог объяснить. Код привести не могу, иначе бы и вопроса не было.
Как я почитал, по английски это часто называют Event, мне привычнее по русски событие/сигнал. Мне нужно в своём классе создать свой Event/событие/сигнал, для примера:
1. У меня есть КлассА, в котором есть некий счётчик, который в ходе выполнения программы будет непрывно расти. 2. На каждую 1000 этого счётчика КлассА должен вызвать внешний (переданный ему после создания экземпляра) метод заданого типа.
То есть как я понимаю со стороны класса мне нужна переменная которая хранит указатель на метод с определёнными параметрами, нужен метод через который в эту переменную будет передан указатель, и нужна конструкция которая по указателю вызовит внешни метод. Со стороны программы мне нужен сам метод (с заданными параметрами) и способ создать указатель на этот метод.
Не смог разобрать как это сделать в басике, если описанное непонятно могу привести код. но не на басике (если это уместно).
1. У меня есть КлассА, в котором есть некий счётчик, который в ходе выполнения программы будет непрывно расти.
В класс можно отправить указатель на функцию\процедуру И потом также можно через метод передавать А вот внутри между методами и конструктором - сложнее (по крайней мере, на моем уровне понимания) В некоторых библиотеках, например, IUP, есть возможности для упрощения таких действий(конечно, если класс будет использоваться с функциями IUP)
Код
Declare Sub set(n As Integer)
Type type_example Declare Constructor (func As Any Ptr) Declare Destructor() As Integer Y Declare Static Function write_ (func As Any Ptr) As Integer End Type
Destructor type_example() End Destructor
Constructor type_example(func As Any Ptr) Dim Set1 As Sub(n As Integer)
Set1=Cast(Any Ptr,func) set1(200)
End Constructor
Function type_example.write_ (func As Any Ptr) As Integer Dim Set1 As Sub(n As Integer)
Set1=Cast(Any Ptr,func) set1(100) Return 0 End Function
Dim As type_example Ptr example
example = New type_example(@set) example->write_(@set)