purebasic.info

PureBasic forum
Текущее время: Вт янв 16, 2018 8:32 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Пн май 07, 2012 8:37 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Во многих языках программирования таких как, например, Delphi, C++, Java и других, есть поддержка объектно-ориентированной парадигмы программирования. PureBasic так же имеет поддержку этой концепции, но на очень низком уровне, многие, даже большинство принципов ООП не поддерживаются. В этой статье я не буду поднимать вопрос о преимуществе той или иной модели программирования, это вечный конфликт непримиримых сторон. Тем не менее, я считаю что поддержка ООП в PureBasic не заслуженно обделена вниманием. В этой статье я расскажу все, о чем знаю сам, касательно PB и ООП. Сразу обращаю ваше внимание на то, что вся информация получена опытным путем, так как информации по данной теме практически нет. Я не претендую на то, что вся информация изложенная мной - истина в последней инстанции. Эта информация - мои личные наблюдения.
Итак, что же представляет из себя класс? В PureBasic класс - это тот же интерфейс (Interface), о котором я писал в прошлой статье. Напомню как он оформляется:
Код:
1
2
3
4
5
6
7
8
9
CompilerIf Defined(IWinApi,#PB_Interface) = 0
  Interface IWinApi
    Send(uMsg.l,wParam.l = 0,lParam.l = 0)
    SetLong(nIndex.l,NewLong.l)
    Msg()
    Destroy()
    Release()
  EndInterface
CompilerEndIf


Где IWinApi - имя класса, а Send, SetLong, Destroy и Release - его методы. Это лишь "рычаги" для управления объектом, который кроется внутри. Хочу обратить ваше внимание на то, что в качестве входных параметров могут выступать любые данные, кроме массивов, хз почему, но это факт.
Что такое объект и из чего он состоит? Объект - это реализация класса, во время его создания для него выделяется память и производится инициализация. Память выделяемая для объекта никак не зависит от количества методов класса, память выделяется в соответствии с типом данных и их количестве в объекте. Состоит он из таблици виртуальных методов (т.н. "vtable", далее ТВМ) и данных объекта. Данные объекта доступны только внутри методов класса. ТВМ представляет собой указатель на массив указателей процедур реализующих методы класса.

Изображение

В PureBasic ВТМ можно оформить в виде структуры со статическим массивом или записать ее в секцию данных. Мой выбор пал на секцию данных, ибо меньше заморочек и нет необходимости каждый раз заполнять массив структуры. Оформляется ВТМ таким образом:
Код:
1
2
3
4
5
6
7
8
DataSection
  IWinApi_vTable:
 Data.i @IWinApi_Send    ()
  Data.i @IWinApi_SetLong ()
  Data.i @IWinApi_Msg     ()
  Data.i @IWinApi_Destroy ()
  Data.i @IWinApi_Release ()
EndDataSection


Где IWinApi_vTable - имя метки, Data.i @Имя_процедуры - указатель на процедуру реализующую метод. Важно помнить, что необходимо соблюдать последованность при заполнении ВТМ, т.е нужно записать указатели в той последовательости, в которой располоенны методы в классе (в Interface), и наоборот.

Данными объекта могут выступать данные любого типа: строки, целые числа, числа с плавающей точкой, структуры, массивы, динамические списки, прототипы функций и классы (интерфейсы) и т.д., и должны располагаться в объекте после ВТМ.

Изображение

По факту, в PureBasic, объект класса - это самая обыкновенная структура. Оформляется она примерно так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
Prototype.i SendMessage(hWnd,uMsg,wParam,lParam)
Prototype.i SetWindowLong(hWnd,nIndex,NewLong)
Prototype.i DestroyWindow(hWnd)
 
CompilerIf Defined(IWinApiObject,#PB_Structure) = 0
  Structure IWinApiObject
    *vTable
    hWnd.l
    SendMessage.SendMessage
    SetWindowLong.SetWindowLong
    DestroyWindow.DestroyWindow
  EndStructure
CompilerEndIf


Где IWinApiObject - имя объекта, *vTable - виртуальная таблица методов, а hWnd, SendMessage, SetWindowLong и DestroyWindow - данные объекта. В даном примере SendMessage, SetWindowLong и DestroyWindow - прототипы Windows32 API функций библиотеки user32.dll, а hWnd - дескриптор окна. Как я уже писал выше: при инициализации класса, выделяется память под объект, в приведенном примере размер памяти равен 20 байт (SizeOf(IWinApiObject)), из них лишь 4 байта (Long) выделяется под ВТМ, остальные 16 байт под данные.
Одним из важных моментов создания класса, является реализация всех его методов. Проще говоря, написания процедур, оперирующих данными объектами. Лично я, оформляю процедуры в таком формате:
ИмяИнтерфейса_ИмяМетода(*this.ИмяОбъекта[,аргумент1,аргумент2,...])
Где *this.ИмяОбъекта - указатель на объект. И входные аргументы метода (не обязательно). Указатель на объект - является обязательным аргументом в тех процедурах реализующих методы класса, в которых требуются данные класса, и если его не добавлять - нарушается соглашение о вызове thiscall. thiscall - метод вызова подпрограмм, где указатель на объект в функцию передается в регистре ECX. То есть при вызове методов класса, нам не придется каждый раз, в ручную, указывать на объект класса, все это делает компилятор. Итак рассмотрим код процедур реализующие все методы нашего класса IWinApi.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Procedure IWinApi_Send(*this.IWinApiObject,uMsg.l,wParam.l,lParam.l)
  ProcedureReturn *this\SendMessage(*this\hWnd,uMsg,wParam,lParam)
EndProcedure
 
Procedure IWinApi_SetLong(*this.IWinApiObject,nIndex,NewLong)
  ProcedureReturn *this\SetWindowLong(*this\hWnd,nIndex,NewLong)
EndProcedure
 
Procedure IWinApi_Msg(*this.IWinApiObject)
  ProcedureReturn MessageRequester("IWinApi",#PB_Compiler_Procedure)
EndProcedure
 
Procedure IWinApi_Destroy(*this.IWinApiObject)
  ProcedureReturn *this\DestroyWindow(*this\hWnd)
EndProcedure
 
Procedure IWinApi_Release(*this.IWinApiObject)
  IWinApi_Destroy(*this)
  FreeMemory(*this)
  *this = 0
  ProcedureReturn *this
EndProcedure


Не буду заострять внимание на всем коде, отановлюсь лишь на отличительных чертах данных процедур от обычых. Во-первых, как уже говорил выше, первым параметром всех методов, кроме IWinApi_Msg, является указатель на объект IWinApiObject. Указатель на объект в этих функциях нужен для передачи дескриптора окна в функциям объекта. В методе IWinApi_Msg указатель на объект не нужен потому, что в нем не используются данные объекта. Стоит отметить, что значения данных объекта можно менять, то есть они являются readable/writeable. Еще одним из важных моментов является то, что память, выделенную для объекта нужно высвободить. Высвобождать память внутри метода класса не обязательно, но я предпочитаю реализовывать метод Release.
Одним из недостатков ООП в PureBasic, является то, что нельзя вызывать внутри одного метода другой метод класса, т.е запись такого вида:
Цитата:
Procedure IWinApi_Release(*this.IWinApiObject)
::Destroy()
FreeMemory(*this)
*this = 0
ProcedureReturn *this
EndProcedure

как, например в C++. Вместо этого я внутри метода вызываю непосредственно саму фукцию реализующую нужного метода, передав ей указатель на объект класса:
Цитата:
Procedure IWinApi_Release(*this.IWinApiObject)
IWinApi_Destroy(*this)
FreeMemory(*this)
*this = 0
ProcedureReturn *this
EndProcedure

Теперь рассмотрим реализацию коструктора класса. Хочу заметить, что отсутствие в PureBasic облегченного механизма создания конструктора класса, на мой взгляд, является одним из крупнейших недостатков, который усложняет работу с ООП. Чтобы инициализировать класс, нужо выделить память для объекта класса, провести инициализацию объекта, заполнить данные (если требуется), записать в объект виртуальную таблицу методов и записать указатель на объект в экземпляр класса. Рассмотрим процедуру инициализации:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Procedure IWinApi(hWnd.l)
  Protected *this.IWinApiObject = AllocateMemory(SizeOf(IWinApiObject))
  InitializeStructure(*this,IWinApiObject)
  If Not *this
    Debug "Error Initialize *this { "+#PB_Compiler_Procedure+" }"
    ProcedureReturn -1
  EndIf
  If OpenLibrary(0,"user32.dll")
    *this\SendMessage = GetFunction(0,"SendMessageA")
    *this\SetWindowLong = GetFunction(0,"SetWindowLongA")
    *this\DestroyWindow = GetFunction(0,"DestroyWindow")
    CloseLibrary(0)
  EndIf
  *this\hWnd = hWnd
  *this\vTable = ?IWinApi_vTable
  ProcedureReturn  *this
EndProcedure


В данном примере объявляется объект IWinApiObject для которого выделяется память в размере SizeOf(IWinApiObject) и проводится инициализация объекта функцией InitializeStructure. Далее заполняются прототипы функций адресами этих функций из системной библиотеки user32.dll, записывается дескриптор окнаи передается ВТМ в объект. Таким образом у нас есть уже готовый, работающий класс. Осталось провести тест класса. Напишем следующую программу, в которой используем наш класс:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Procedure WindowProc(hWnd, uMsg, wParam, lParam)
  If uMsg = 2012
    MessageRequester(PeekS(wParam),PeekS(lParam))
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
OpenWindow(0,0,0,500,400,"window",#WS_SYSMENU|#PB_Window_ScreenCentered)
ButtonGadget(0,10,10,120,36,"TEST")
SetWindowCallback(@WindowProc())
*wa.IWinApi = IWinApi(WindowID(0))
 
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      If EventGadget() = 0
        *wa\Send(2012,@"IWinApi",@"Hello! I'm test class")
        *wa\Msg()
      EndIf
    Case #WM_CLOSE
      *wa\Release()
      Break
  EndSelect
ForEver


Программа работает без ошибок, что свидетельствует о том, что наш класс написан правильно и не содержит ошибок.

Теперь перейдем к одному из важнейших механизмов ООП, такому как наследование. Наследование позволяет расширять функциональость уже существующего, родительского класса, освобождая программиста от бесконечного переписывания одного и того же куска кода. Для этого нужно написать новый класс-потомок, который будет наследовать все методы класса-родителя, дополняя своим функционалом. Для наследования методов класса в PureBasic предусмотрен оператор Extends. Есть два способа наследования, которые можно отнести к Public и Private. Public - значит, что методы класса будут доступны в любом месте кода, а Private - только внутри методов класса.
При Public наследовании методы класса-родителя располагаются вслед за методами класса-потомка. Схематически можно изобразить это так:

Изображение

Второй способ Private подразумивает, что класс-родитель помещается непосредственно в объект класса-потомка. Схематически объект такого класса выглядит так:

Изображение

Теперь перейдем непрсредственно к коду. Напишем класс-родитель с именем Test, имеющий всего один метод Debug().
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CompilerIf Defined(Test,#PB_Interface) = 0
  Interface Test
    Debug()
  EndInterface
CompilerEndIf
 
CompilerIf Defined(TestObject,#PB_Structure) = 0
  Structure TestObject
    *vTable
    DbgStr.s
  EndStructure
CompilerEndIf
 
 
Procedure Test(String.s = "")
  Protected *this.TestObject = AllocateMemory(SizeOf(TestObject))
  InitializeStructure(*this,TestObject)
  If Not *this
    Debug "Error Initialize object { "+#PB_Compiler_Procedure+" }"
    ProcedureReturn -1
  EndIf
  If String <> ""
    *this\DbgStr = String
  Else
    *this\DbgStr = "Null string"
  EndIf
  *this\vTable = ?_Test_
  ProcedureReturn  *this
EndProcedure
 
 
Procedure Test_Debug(*this.TestObject)
  Debug *this\DbgStr
EndProcedure
 
 
DataSection
  _Test_:
 Data.i @Test_Debug()
EndDataSection


Удостоверимся в работоспособности нашего класса.
Код:
1
2
*tc.Test = Test()
*tc\Debug()


В окне отладчика должна появиться строка "Null string", что свидетельствует о том, что класс написан правильно. Теперь напишем Public класс-потомок с именем TestEX.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
CompilerIf Defined(TestEX,#PB_Interface) = 0
  Interface TestEX Extends Test
   SetString.s(String.s)
  EndInterface
CompilerEndIf
 
CompilerIf Defined(TestEXObject,#PB_Structure) = 0
  Structure TestEXObject Extends TestObject
    *vTableEx
  EndStructure
CompilerEndIf
 
Procedure.s TestEX_SetString(*this.TestEXObject,String.s)
  OldString.s = *this\DbgStr
  *this\DbgStr = String
  ProcedureReturn OldString
EndProcedure
 
 
Procedure TestEX(String.s = "")
  Protected *this.TestexObject = AllocateMemory(SizeOf(TestexObject))
  InitializeStructure(*this,TestexObject)
  If Not *this
    Debug "Error Initialize object { "+#PB_Compiler_Procedure+" }"
    ProcedureReturn -1
  EndIf
  If String <> ""
    *this\DbgStr = String
  Else
    *this\DbgStr = "Привет! Я метод класса-родителя."
  EndIf
  *this\vTable = ?_Test_
  *this\vTableEx = ?_TestEX_
  ProcedureReturn  *this
EndProcedure
 
 
DataSection
  _TestEX_:
 Data.i @TestEX_SetString()
EndDataSection


Чтобы инициализировать класс потомок, нужно в его конструктор добавить инициализацию класса-родителя.Таким образом у нас получился класс TestEX, имеющий два метода: родительский Debug, и новый метод SetString. Теперь протестируем наш класс:
Код:
1
2
3
4
5
6
*ce.TestEX = TestEX()
 
 
*ce\Debug()
*ce\SetString("Привет! Я метод класса-потомка.")
*ce\Debug()



Сначала в окне отладчика должна появиться строка "Привет! Я метод класса-родителя.", а после вызова метода SetString - "Привет! Я класса-потомка."
В случае с классом типа Private, не нужно в конструкторе класса заного вручную инициализировать этот класс, достаточно вызвать функцию-конструктор для этого класса.

Лично для меня объектно-ориентированная парадигма в PureBasic является одним из удобнейших механизмов. Большинство кода, который я пишу не обходится без ООП. Конечно нельзя говорить о том, что в PureBasic ООП поддерживает все механизмы данной концепции, все кастрированно и недоразвито, но как говорится "За неимением горничной, будем е**ть дворника". Стоит лишь надеяться, что Фред и его команда планируют развивать эту модель программирования в PureBasic.


Вложения:
OOP.rar [375.7 KiB]
Скачиваний: 258
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 8:29 am 
Не в сети
профессор

Зарегистрирован: Вт ноя 08, 2011 10:17 am
Сообщений: 578
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
красота ООП с Делфи, Джава и других, как раз в том, что вся внутренняя работа по обеспечению ООП скрывается от разработчика, отчего код самих классов и их использования получается простой и можно сказать красивый. в приведенном случае - когда реализация на виду, на код смотреть грустно. Возможно это дело привычки, но...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 9:35 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
nikoniko писал(а):
красота ООП с Делфи, Джава и других, как раз в том, что вся внутренняя работа по обеспечению ООП скрывается от разработчика, отчего код самих классов и их использования получается простой и можно сказать красивый. в приведенном случае - когда реализация на виду, на код смотреть грустно. Возможно это дело привычки, но...
тоже грустно, но как уже сказано выше
Цитата:
"За неимением горничной, будем е**ть дворника".
но лично меня пока все устраивает. Наверное и правда привык.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 3:15 pm 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 222
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
какая уж парадигма? :shock:

структуры через процедуры еле передаются

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 3:52 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
egons писал(а):
какая уж парадигма? :shock:

структуры через процедуры еле передаются
что значит еле? Ванюшка ел,ел, ел и не наелся?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 4:22 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6220
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
Димастый писал(а):
Лично для меня объектно-ориентированная парадигма в PureBasic является одним из удобнейших механизмов. Большинство кода, который я пишу не обходится без ООП.

Было бы интересно взглянуть на готовые приложения, оценить плоды ООП. Надеюсь возможно показать публике хотя бы малую толику из того огромного кол-ва программ, написанных с применением ООП на PureBasic?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 4:33 pm 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 222
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Димастый писал(а):
egons писал(а):
какая уж парадигма? :shock:

структуры через процедуры еле передаются
что значит еле? Ванюшка ел,ел, ел и не наелся?

через (_|_), если держать академический стиль. 8)

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 5:38 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
kvitaliy писал(а):
Димастый писал(а):
Лично для меня объектно-ориентированная парадигма в PureBasic является одним из удобнейших механизмов. Большинство кода, который я пишу не обходится без ООП.

Было бы интересно взглянуть на готовые приложения, оценить плоды ООП. Надеюсь возможно показать публике хотя бы малую толику из того огромного кол-ва программ, написанных с применением ООП на PureBasic?
Там особо нет ничего. Я PureBasic использую не как основной инструмент, а как подопытную лошадку. Сначала пишу на пурике, потом на рабочей лошадке. Можно сказать, что пурик заменяет мне блок-схему. Щас вот пытаюсь накатать одну прогу, напишу - выложу если Вам интересно взглянуть.
egons писал(а):
через (_|_), если держать академический стиль.
с этим полностью согласен. Даже возразить нечего.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 5:46 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
Димастый писал(а):
. Сначала пишу на пурике, потом на рабочей лошадке.
А не проще тогда будет создать DLL на пурике и использовать ее?
Экономия времени.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 6:04 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6220
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
Димастый писал(а):
Сначала пишу на пурике, потом на рабочей лошадке.

Если я правильно понял, то ты вначале создаешь на Пурике объекты, потом при помощи этих объектов на Пурике пишешь прототип программы, проектируешь интерфейс, логику. А уже потом пишешь на каком то ЯП практически с нуля ( ибо код на Пурике + самодельная ООП вряд ли на что то похоже) конечный продукт. Так?
Дима, при всём моем уважении к тебе выглядит это очень странно. Назови хоть пару причин по которым ты сразу не пишешь программу на своем секретном ЯП?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 6:45 pm 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 222
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Димастый писал(а):
egons писал(а):
через (_|_), если держать академический стиль.
с этим полностью согласен. Даже возразить нечего.


тогда я поправлюсь: если использовать процедуру для передачи структур, то это ООП?

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 7:12 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Не ну развели сыр-бор... Вы правда считаете, что я ПОЛНОСТЬЮ пишу программу на пурике, учитываю все нюансы, оптимизирую и т.д., а потом всё портирую на ассемблер? Я че параноик по вашему? Я имел ввиду, что, например, нужно разобраться с pе форматом, вы думаете я сразу возьму такой и в с места в карьер на ассемблере накатал за 15 минут код, и все счастливы? Я сначала на пурике беру, и разбираюсь с проблемой. А потом уже, опираясь на код пурика, пишу на асме. То что оформляю как объект, чистой воды привычка после сей. И на асме я не оформляю объектами, не надо мне шизофрению диагностировать.
Теперь вопрос об ООП это или нет. В пурике, все о чем я говорил выше в статье, есть ничто иное (имхо), как технология COM. Если кто не знает значение обревиатуры COM - компонент-объектная модель! Ключевое слово ОБЪЕКТ. То есть уже можно судить об ооп. Идем далее: вы сказали "передача структуры в процедуру"? Вы слышали о соглашении вызова thiscall? Или вы считаете это не thiscall? Читаем вики: thiscall - Используется в компиляторах C .
Обеспечивает передачу аргументов при
вызовах методов класса в объектно
ориентированной среде. Опять же ключевое слово ОБЪЕКТНО. Я не утверждаю что это и есть ооп, но нечто близкое к тому. По поводу того, что все написанное в статье не является истиной в последней инстанции. В начале статьи так и написано. Вся информация - чистая отсебятина. Пишу с телефона, так что без бб кодов и без цитат. Думаю разберетесь. =)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 7:38 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт май 24, 2011 7:01 pm
Сообщений: 505
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Виталий, нет никакой тайны. Пишу на масме. Не та что-бы пишу, учусь. Поэтому не могу сходу на нем писать. Сложно очень.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2012 8:13 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6220
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
Димастый писал(а):
Пишу на масме. Не та что-бы пишу, учусь.

Ну теперь всё стало понятно. А то я уж было подумал недоброе :D

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 27, 2013 4:45 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 738
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
А как сделать такую конструкцию, допустим есть методы SetNumber() и GetNumber(), нужно вернуть число с помощью GetNumber() в Debug

Код:
1
Debug *obj\GetNumber() 



теперь необходимо превратить число в строку с помощью метода ToString()

На C# это выглядело бы так:

GetNumber().ToString()

Как на PureBasic сделать такое?

Код:
1
2
3
4
5
6
7
8
9
10
11
 
Debug *obj\GetNumber()\ToString()
 
...
или
...
 
*oNumb = *obj\GetNumber()
Debug *oNumb                 ; возвращает число
Debug *oNumb\ToString() ; возвращает то же число в виде строки
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB