Files
harbour-core/harbour/samples/cccppc/object.prg
1999-11-09 01:37:27 +00:00

619 lines
18 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* $Id$
*/
**********************************************************************
// Ezek az a priori oszt饊yok. Amikor objektumhoz nyρunk, akkor
// ezek automatikusan felt鎇t𡞫nek.
static Object
static Behavior
static Meta
static MetaClass
**********************************************************************
#include "error.ch"
#include "objgen.ch"
#include "object.och"
#include "behavior.och"
#include "meta.och"
#include "metaclas.och"
#define _OBJECT_PRG_
#define setCMethods(pOsztaly) ciOBJECT(pOsztaly)
#define setCams(ta,tm) amOBJECT(ta,tm)
#define _NO_BEHAVIOR_
#define _NO_CLOBJECT_
#include "object.och"
#undef _OBJECT_PRG_
#undef setCMethods
#undef setCams
#undef _NO_CLOBJECT_
#undef _NO_BEHAVIOR_
#undef CTHIS
#define _BEHAVIOR_PRG_
#define setCMethods(pOsztaly) ciBEHAVIOR(pOsztaly)
#define setCams(ta,tm) amBEHAVIOR(ta,tm)
#define _NO_META_
#define _NO_CLBEHAVIOR_
#include "behavior.och"
#undef _BEHAVIOR_PRG_
#undef setCMethods
#undef setCams
#undef _NO_CLBEHAVIOR_
#undef _NO_META_
#undef CTHIS
#define _META_PRG_
#define setCMethods(pOsztaly) ciMETA(pOsztaly)
#define setCams(ta,tm) amMETA(ta,tm)
#define _NO_METACLAS_
#define _NO_CLMETA_
#include "meta.och"
#undef _META_PRG_
#undef setCMethods
#undef setCams
#undef _NO_CLMETA_
#undef _NO_METACLAS_
#undef CTHIS
#include "metaclas.och"
// K𤴆elez婫n ugyanaz.
// #define ciMETACLAS(pOsztaly) ciMETA(pOsztaly)
**********************************************************************
* *
* Az OBJECT oszt饊y *
* *
**********************************************************************
**********************************************************************
function clOBJECT()
if (Object==nil)
primitiveAllAPClassCreate()
endif
return Object
**********************************************************************
// function clOBJECTCLASS()
// Az Object oszt饊y meta oszt饊y慯 adja.
// Ez m<> megvan, a Behavior az.
// return clBEHAVIOR()
**********************************************************************
static function ob_oinit(this)
// Ez egy virtu饊is m𩥈elet, az implement蠏i▏a <20>es.
return this
**********************************************************************
static function ob_getclass(this)
return eval(this[1][1])
**********************************************************************
static function ob_isClass(this)
return .f.
**********************************************************************
static function ob_getAttrib(this,attribId)
if (valtype(attribId)=="C")
attribId:=BEHAVIOR.(OBJECT.this:getClass()):attribIdx(attribId)
if (attribId==nil)
errAttrib("getAttrib",{BEHAVIOR.(OBJECT.this:getClass()):name,attribId})
endif
endif
return this[attribId]
**********************************************************************
static function ob_setAttrib(this,attribId,value)
if (valtype(attribId)=="C")
attribId:=BEHAVIOR.(OBJECT.this:getClass()):attribIdx(attribId)
if (attribId==nil)
errAttrib("getAttrib",{BEHAVIOR.(OBJECT.this:getClass()):name,attribId})
endif
endif
return this[attribId]:=value
**********************************************************************
**********************************************************************
* *
* A BEHAVIOR oszt饊y *
* *
**********************************************************************
**********************************************************************
function clBEHAVIOR()
// Az oszt饊y el𦽳zed<65>e. (class)
if (Behavior==nil)
primitiveAllAPClassCreate()
endif
return Behavior
**********************************************************************
// function clBEHAVIORCLASS()
// A Behavior oszt饊y meta oszt饊y慯 adja.
// Ez m<> megvan, a Meta az.
// return clMETA()
**********************************************************************
static function be_onew(this)
// K<>z﹀ egy objektumot, <20> inicializ饊ja.
// Az objektum a 'this' oszt饊yba fog tartozni.
local obj
obj:=BEHAVIOR.this:ocreate()
OBJECT.obj:oinit()
return obj
**********************************************************************
static function be_ocreate(this)
// K<>z﹀ egy objektumot, de nem inicializ饊ja.
// Az objektum a 'this' oszt饊yba fog tartozni.
local obj
obj:=primitiveCreateObj(this)
return obj
**********************************************************************
static function be_rawoinit(this,parent,name,nAttribs,nMethods,amBlock,methodsBlock)
// Inicializ饊ja a 'this' oszt饊yt.
local w
ob_oinit(this)
primitiveInitClass(this,parent,name,nAttribs,nMethods,amBlock,methodsBlock)
if (parent!=nil)
if (BEHAVIOR.this:classId==nil)
BEHAVIOR.this:parentClassIds:=BEHAVIOR.parent:parentClassIds
else
if (nil!=(w:=BEHAVIOR.parent:parentClassIds))
BEHAVIOR.this:parentClassIds:=w:=aclone(w)
else
BEHAVIOR.this:parentClassIds:=w:={}
endif
if (len(w)<BEHAVIOR.this:classId)
asize(w,BEHAVIOR.this:classId)
endif
w[BEHAVIOR.this:classId]:=BEHAVIOR.this:classId
endif
endif
return this
**********************************************************************
static function be_oinit(this,parent,name,nAttribs,nMethods,amBlock,methodsBlock)
// Inicializ饊ja a 'this' oszt饊yt.
// Ellen𩂈zi, hogy az oszt饊y metaoszt饊y慙ak van-e m<> eleme.
// Ezt az ellen𩂈z<F0A98288>t a metaoszt饊yokn饊 ki kell kapcsolni.
local classOf
classOf:=this:getClass()
if (classOf!=nil .and. META.classOf:ofClass!=nil)
alert("Behavior:oinit: '"+name+"';"+;
"Ennek a metaoszt饊ynak m<> van l<>rehozva eleme:;"+;
"'"+META.classOf:name+"'")
META.classOf:ofClass:=nil
endif
BEHAVIOR.this:rawoinit(parent,name,nAttribs,nMethods,amBlock,methodsBlock)
META.classOf:ofClass:={||this}
return this
**********************************************************************
static function be_getmethodsimplement(this)
return eval(C.BEHAVIOR:objmethodsimplement)
**********************************************************************
static function be_isClass(this)
return .t.
**********************************************************************
static function be_attribIdx(this,name)
local w
name:=lower(name)
w:=ascan(BEHAVIOR.this:attribs,{|x| x[2]==name})
return if (w==0,nil,BEHAVIOR.this:attribs[w][1])
**********************************************************************
static function primitiveCreateObj(aClass)
// K<>z﹀ egy objektumot, ami az aClass oszt饊yba fog tartozni.
// Akkor is m䭯㺱nie kell, ha az aClass parent-je nincs be饊l﹀va.
local obj
obj:=array(BEHAVIOR.aClass:objSize)
obj[1]:=eval(BEHAVIOR.aClass:objMethodsImplement)
return obj
**********************************************************************
static function evalAmBlocks(aClass)
local m,c,i
// local t
// t:=eval(BEHAVIOR.aClass:objMethodsImplement)
m:={}
c:=aClass
while(c!=nil)
if (nil!=BEHAVIOR.c:amBlock)
aadd(m,BEHAVIOR.c:amBlock)
endif
c:=BEHAVIOR.c:parent
end while
for i:=len(m) to 1 step -1
eval(m[i],BEHAVIOR.aClass:attribs,BEHAVIOR.aClass:methods)
end for
return aClass
**********************************************************************
static function evalMethodsBlocks(aClass)
local t,m,c,i
t:=eval(BEHAVIOR.aClass:objMethodsImplement)
m:={}
c:=aClass
while(c!=nil)
if (nil!=BEHAVIOR.c:methodsBlock)
aadd(m,BEHAVIOR.c:methodsBlock)
endif
c:=BEHAVIOR.c:parent
end while
for i:=len(m) to 1 step -1
eval(m[i],t)
end for
return aClass
**********************************************************************
static function primitiveInitClass(aClass,parent,name,nAttribs,nMethods,;
amBlock,methodsBlock)
// Inicializ饊ja az aClass oszt饊yt.
// Akkor is m䭯㺱nie kell, ha az aClass parent-je nincs be饊l﹀va, <20>
// a parent nil.
local t
BEHAVIOR.aClass:parent :=parent
BEHAVIOR.aClass:name :=name
BEHAVIOR.aClass:objSize :=nAttribs
BEHAVIOR.aClass:attribs :=array(nAttribs-CA_NIL_N)
BEHAVIOR.aClass:methods :=array(nMethods-CM_NIL_N)
BEHAVIOR.aClass:amBlock := amBlock
BEHAVIOR.aClass:methodsBlock := methodsBlock
t:=array(nMethods)
t[1]:={||aClass}
t[3]:=ob_getObjId()
BEHAVIOR.aClass:objMethodsImplement := {||t}
// V<>rehajtjuk az 𤳙szes 𦽳re, meg mag<61>a is a methodsBlock-ot.
evalMethodsBlocks(aClass)
// V<>rehajtjuk az 𤳙szes 𦽳re, meg mag<61>a is az amBlock-ot.
evalAmBlocks(aClass)
return aClass
**********************************************************************
static function primitiveMetaClassCreate()
// Elk<6C>z﹀i a MetaClass oszt饊yt. Ennek primit」nek kell lenni, mert
// semmilyen objektum m𩥈elet nem tud futni, am︹ nincs MetaClass.
local tMetaClass
if (CA_METACLAS_N!=CA_META_N)
alert("CA_METACLAS_N!=CA_META_N;"+;
"A MetaClass-t nem lehet elk<6C>z﹀eni.")
quit
endif
// A MetaClass <20> a Meta m𩥈eleti t<>l䰇慙ak ugyanannak kell lennie.
if (CM_METACLAS_N!=CM_META_N)
alert("CM_METACLAS_N!=CM_META_N;"+;
"A MetaClass-t nem lehet elk<6C>z﹀eni.")
quit
endif
MetaClass:=array(CA_METACLAS_N)
BEHAVIOR.MetaClass:parent :=nil // Nem tudjuk kit鎇teni, mert ez a Meta
// lesz.
BEHAVIOR.MetaClass:name :="METACLAS"
BEHAVIOR.MetaClass:objSize :=CA_METACLAS_N
BEHAVIOR.MetaClass:attribs :=array(CA_METACLAS_N)
BEHAVIOR.MetaClass:methods :=array(CM_METACLAS_N)
BEHAVIOR.MetaClass:amBlock :={|ta,tm| nil/*amMETACLAS(ta,tm)*/}
BEHAVIOR.MetaClass:methodsBlock:={|t|t/*ciMETACLAS(t)*/}
tMetaClass:=array(CM_META_N)
tMetaClass[1]:={||MetaClass}
BEHAVIOR.MetaClass:objMethodsImplement := {||tMetaClass}
// Ezzel a MetaClass k<>zen is van, azzal a kit<69>ellel, hogy
// nincs be饊l﹀va a parent-je, <20> nem futottak az
// amBlock-ok <20> a methodsBlock-ok.
return MetaClass
**********************************************************************
static function primitiveAllAPClassCreate()
// Elk<6C>z﹀i mind e n<>y oszt饊yt.
primitiveMetaClassCreate()
Meta:=primitiveCreateObj(MetaClass)
primitiveInitClass(Meta,nil,"META",CA_META_N,CM_META_N,nil,nil)
Behavior:=primitiveCreateObj(Meta)
primitiveInitClass(Behavior,nil,"BEHAVIOR",CA_BEHAVIOR_N,CM_BEHAVIOR_N,nil,nil)
Object:=primitiveCreateObj(Behavior)
primitiveInitClass(Object,nil,"OBJECT",CA_OBJECT_N,CM_OBJECT_N,nil,nil)
// Most minden oszt饊y k<>zen van, kiv<69>e, hogy nincsenek be饊l﹀va
// a parentek, valamint nincsenek be饊l﹀va <20> nem futottak az
// amBlock-ok <20> a methodsBlock-ok.
// A sz<73><7A> oszt饊yok be饊lit坟a.
BEHAVIOR.Object:parent :=nil
META.Behavior:parent :=Object
METACLAS.Meta:parent :=Behavior
METACLAS.MetaClass:parent :=Meta
// Az amBlock-ok <20> a methodsBlockok be饊l﹀坟a.
BEHAVIOR.Object:amBlock :={|ta,tm|amOBJECT(ta,tm)}
BEHAVIOR.Object:methodsBlock :={|t|ciOBJECT(t)}
META.Behavior:amBlock :={|ta,tm|amBEHAVIOR(ta,tm)}
META.Behavior:methodsBlock :={|t|ciBEHAVIOR(t)}
METACLAS.Meta:amBlock :={|ta,tm|amMETA(ta,tm)}
METACLAS.Meta:methodsBlock :={|t|ciMETA(t)}
METACLAS.MetaClass:amBlock :={|ta,tm|nil/*amMETACLAS(ta,tm)*/}
METACLAS.MetaClass:methodsBlock :={|t|t/*ciMETACLAS(t)*/}
// Az amBlock-ok <20> a methodsBlockok v<>rehajt坟a.
evalMethodsBlocks(Object)
evalAmBlocks(Object)
evalMethodsBlocks(Behavior)
evalAmBlocks(Behavior)
evalMethodsBlocks(Meta)
evalAmBlocks(Meta)
evalMethodsBlocks(MetaClass)
evalAmBlocks(MetaClass)
return nil
**********************************************************************
**********************************************************************
* *
* A META oszt饊y *
* *
**********************************************************************
**********************************************************************
function clMETA()
// Az oszt饊y el𦽳zed<65>e. (class)
if (Meta==nil)
primitiveAllAPClassCreate()
endif
return Meta
**********************************************************************
// function clMETACLAS()
// A Meta oszt饊y meta oszt饊y慯 adja.
// Ez m<> megvan.
**********************************************************************
static function me_oinit(this,parent,name,nAttribs,nMethods,amBlock,methodsBlock)
// Inicializ饊ja a 'this' metaoszt饊yt.
// Mj.: H」ja a Behavior oinit()-j<>, <20> inicializ饊ja
// az ofClass-t 'nil'-re.
be_rawoinit(this,parent,name,nAttribs,nMethods,amBlock,methodsBlock)
META.this:ofClass:=nil
// ciBEHAVIOR(eval(META.this:objMethodsImplement))
return this
**********************************************************************
static function me_onew(this,parent,name,nAttribs,nMethods,;
amBlock,methodsBlock)
// L<>rehoz egy ο oszt饊yt, <20> inicializ饊ja.
// Az ο oszt饊y a 'this' eleme lesz, teh慯 az ο oszt饊y
// oszt饊ya a 'this'lesz.
// Mj.: Ez a 'Meta' egy elem<65>ek a m𩥈elete. A 'Meta' elemei
// pedig meta oszt饊yok. Teh慯 ez egy meta osztaly egy elem<65>
// hozza l<>re, a meta oszt饊yok elemei pedig oszt饊yok. Teh慯
// ez egy ο oszt饊yt (<28> nem metaoszt饊yt!!!) hoz l<>re.
local obj
#ifdef ATTEVE
if (META.this:ofClass!=nil)
alert("meta:onew Ennek a metaoszt饊ynak m<> van l<>rehozva eleme!;"+;
"'"+META.this:name+"'")
META.this:ofClass:=nil
endif
#endif
obj:=META.this:ocreate() // Egy 'this' oszt饊y<E9A58A> objektum l<>rehoz坟a.
BEHAVIOR.obj:oinit(parent,name,nAttribs,nMethods,amBlock,methodsBlock)
// META.this:ofClass:=obj
BEHAVIOR.obj:oinitclass()
return obj
**********************************************************************
static function me_ocreate(this)
// L<>rehoz egy ο oszt饊yt, de nem inicializ饊ja.
local c
#ifdef NEMKELL
if (META.this:ofClass!=nil)
alert("meta:ocreate Ennek a metaoszt饊ynak m<> van l<>rehozva eleme!;"+;
"'"+META.this:name+"'")
META.this:ofClass:=nil
endif
#endif
c:=be_ocreate(this)
if (BEHAVIOR.c:needClassId())
BEHAVIOR.c:classId:=getNextClassId()
endif
return c
**********************************************************************
**********************************************************************
* *
* A METACLAS oszt饊y *
* *
**********************************************************************
**********************************************************************
function clMETACLAS()
// Az oszt饊y el𦽳zed<65>e. (class)
if (MetaClass==nil)
primitiveAllAPClassCreate()
endif
return MetaClass
**********************************************************************
// function clMETACLASCLASS()
// A MetaClass oszt饊y meta oszt饊y慯 adja.
// Ez m<> megvan.
**********************************************************************
function retobj(obj)
return obj
**********************************************************************
function retnil()
return nil
**********************************************************************
function retemptystr()
return ""
**********************************************************************
function rettrue()
return .t.
**********************************************************************
function retfalse()
return .f.
**********************************************************************
function retzero()
return 0
**********************************************************************
function retemptydate()
return ctod("")
**********************************************************************
function errAbstract(this,methodName,methodIdx,params)
local err
err:=errorNew()
err:cargo:=this
err:args:=params
err:canRetry:=.f.
err:description:="Can't execute abstract method"
err:filename:=""
err:severity:=ES_ERROR
err:operation:=if(valtype(methodName)=='C',methodName+"()","")
err:subSystem:="OBJC"
err:subCode:=1
eval(errorblock(),err)
return nil
**********************************************************************
function errAttrib(funName,params/*className,attribName*/)
local err
err:=errorNew()
err:cargo:={}
err:args:=params
err:canRetry:=.f.
err:description:="Can't find attributum: "+;
if(valtype(params[1])=='C',params[1],"")
err:filename:=""
err:severity:=ES_ERROR
err:operation:=funName
err:subSystem:="OBJC"
err:subCode:=1
eval(errorblock(),err)
return nil
**********************************************************************
function ob_getObjId()
static t:={}
return t
**********************************************************************
function isObject(obj)
// Ez a f<>gv<67>y ak<61>milyen (!) <20>t<EFBFBD>r𢡠 megmondja, hogy objektum-e
// vagy sem.
return valtype(obj)=='A' .and.;
len(obj)>=1 .and.;
valtype(obj[1])=='A' .and.;
len(obj[1])>=3 .and.;
valtype(obj[1][3])=='A' .and.;
obj[1][3]==ob_getObjId()
**********************************************************************
function getNextClassId()
// Ezt kell h」nia annak az oszt饊ynak, aki id-t akar.
static id:=0
return ++id
**********************************************************************
static function be_needClassId(this)
return .f.
**********************************************************************
static function be_isInheritFrom(this,parentClass)
local w
if (parentClass==nil)
return .t. // Spec eset, v饊aszthatn慙k a .f.-t is.
endif
if (nil!=(w:=BEHAVIOR.parentClass:classId))
return BEHAVIOR.this:parentClassIds!=nil .and.;
len(BEHAVIOR.this:parentClassIds)>=w .and.;
BEHAVIOR.this:parentClassIds[w]==w
endif
// Fel a f慙.
// alert("M坟zunk: "+;
// "this: "+BEHAVIOR.this:name+";"+;
// "parentClass: "+BEHAVIOR.parentClass:name)
w:=this
while(w!=nil)
if (w==parentClass)
return .t.
endif
w:=BEHAVIOR.w:parent
end while
return .f.
**********************************************************************