PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » ООП с наследованием


ООП с наследованием

Сообщений 1 страница 5 из 5

1

Приветствую форумчан! Прошу поделиться простыми примерами реализации подобия ООП с наследованием. Желательно без сторонних библиотек. Интересует возможность использования Interface, ну и любые возможные реализации.
Исследую этот вариант: Ссылка
Но здесь мне не нравится использование макроса в конструкторе, если понадобится инициализировать много объектов, программа сильно вырастит. Понимаю, что речь идёт о килобайтах, но всё-же хочется более лаконичного решения.

Отредактировано Webarion (16.05.2022 22:40:45)

0

2

Webarion написал(а):

если понадобится инициализировать много объектов, программа сильно вырастит

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

0

3

newJS написал(а):

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

Пробовал, но пока не получилось в этом скрипте.

0

4

Пока остановился на этой реализации:

Код:
Interface IObject
  SetVar(Var)
  GetVar()
  Free()
EndInterface 

Structure pObject 
  *Methods
  Var.i
EndStructure 

Structure pMethods 
  *SetVar
  *GetVar
  *Free
EndStructure 


; Метод записи параметра
Procedure SetVar(*this.pObject, Var) 
  *this\Var = Var
EndProcedure
; Метод чтения параметра
Procedure GetVar(*this.pObject) 
  ProcedureReturn *this\Var
EndProcedure 

; Деструктор
Procedure Free(*this) 
  FreeMemory(*this) 
EndProcedure 

; Инициализация методов
Procedure Init_Methods(*Methods.pMethods)
  *Methods\SetVar = @SetVar()
  *Methods\GetVar = @GetVar()
  *Methods\Free = @Free()
EndProcedure
Init_Methods(pMethods.pMethods)

; Инициализация параметров
Procedure Init_Vars(*this.pObject, Var) 
  *this\Var = Var
EndProcedure  

; Конструктор
Procedure.l New_Object(Var) 
  Shared pMethods 
  *this.pObject = AllocateMemory(SizeOf(pObject)) 
  *this\Methods = @pMethods 
  Init_Vars(*this, Var) 
  ProcedureReturn *this 
EndProcedure 


; Наследование ---------------------------------- 

; Интерфейс наследника
Interface IExObject Extends IObject
  SetExVar(Var)
  GetExVar()
EndInterface 

; Расширяем параметры
Structure pExObject Extends pObject 
  ExVar.i
EndStructure 

; Метод установки параметра наследника
Procedure SetExVar(*this.pExObject, Var) 
  *this\ExVar = Var
EndProcedure

; Метод чтения параметра наследника
Procedure GetExVar(*this.pExObject) 
  ProcedureReturn *this\ExVar
EndProcedure 

; Структура методов наследника
Structure pExMethods Extends pMethods 
  *SetExVar
  *GetExVar
EndStructure 

; Инициализация методов наследника
Procedure Init_ExMethods(*Methods.pExMethods) 
  Init_Methods(*Methods)
  *Methods\SetExVar = @SetExVar()
  *Methods\GetExVar = @GetExVar() 
EndProcedure 
Init_ExMethods(pExMethods.pExMethods) 

; Инициализация параметров наследника
Procedure Init_ExVars(*this.pExObject, Var, ExVar) 
  SetVar(*this, Var)
  *this\ExVar = ExVar
EndProcedure  

; Конструктор наследника
Procedure.l New_ExObject(Var, ExVar) 
  Shared pExMethods 
  *this.pExObject = AllocateMemory(SizeOf(pExObject)) 
  *this\Methods=@pExMethods 
  Init_ExVars(*this, Var, ExVar) 
  ProcedureReturn *this 
EndProcedure 

; Деструктор наследника
Procedure Free_ExObject(*this) 
  FreeMemory(*this) 
EndProcedure 

; ---------------------------------- 

Debug "--- MyObject ---"
MyObject.IObject = New_Object(11)
Debug "'Var' при инициализации = " + MyObject\GetVar()

MyObject\SetVar(22)
Debug "'Var' после SetVar = " + MyObject\GetVar()


Debug "--- MyExObject ---"
MyExObject.IExObject = New_ExObject(33, 44) 

Debug "'Var' при инициализации = " + MyExObject\GetVar()
Debug "'ExVar' при инициализации = " + MyExObject\GetExVar()

MyExObject\SetVar(55)
MyExObject\SetExVar(66)

Debug "'Var' после SetVar = " + MyExObject\GetVar()
Debug "'ExVar' после SetExVar = " + MyExObject\GetExVar()

Для других вариантов тема открыта.

Отредактировано Webarion (23.05.2022 20:12:06)

0

5

Что можно почитать по этой теме:
PureBasic and Object-Oriented Programming

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » ООП с наследованием