Sziasztok!
Segítsetek:
Van egy objektum, melynek van egy initialize-től eltérő metódusa.
function objektum.valami(this)
return NIL
Én itt szeretnék az objektumhoz hozzáadni egy attribot. Erre emlékeim szerint csak egy mód van, az pedig a classAttrib(clid,'attrname')
Namármost a clid (amennyit kerestem), a classIdByName(this:classname)
function objektum.valami(this)
classAttrib(classIdByName(this:classname),'newattrib')
this:newattrib:='hallo'
return NIL
Erre pedig a következő error jön:
ALERT
Operation: _method_::eval
Description: size error
default error block evaluated
errorclass: error
operation: _method_::eval
description: size error
args:{OBJECT subtype=2 oref=b7b6a8a8, STRING length=5 oref=b7b6aea8 "hallo"}
Nem lehetne az Object abstract-ba felvenni egy addAttrib és addMethod metódust?
Egyszerűbb lenne az élet this:addAttrib() -bal ;)
Hozzászólások
Példa:
Nem. Látod a példából, hogy az attribútum hozzáadás/létrehozás az osztályművelet. A classAttrib az osztálydefinícióhoz hozzáad egy attribútumot, a korábban létrehozott objektumokat ez visszamenőleg nem érinti, az újak viszont a módosított struktrúrával keletkeznek.
Menet közben változtatgatni az osztályok struktúráit nem egy szokásos dolog, bár elképzelhető, hogy néha van értelme. De inkább csak úgy, hogy a program runtime definiál egy osztályt, és amikor kész, akkor többet már nem módosítja, csak használja.
Vannak nyelvek, amikben az objektumokat lehet egyedileg bővíteni ezzel-azzal. A CCC-ben nem lehet.
--
CCC3
Proxy osztalyokhoz nagyon hasznos dolog, peldaul xmlrpc wrappolasara.
--
Közelebbről?
Más nyelvekben is lehet osztályokat definiálni runtime. Python-ban magam is csináltam már ilyet. Ha így van, akkor a készülőben levő osztály különböző készültségi fokaihoz tartozó objektumokat lehet példányosítani. Így könnyű ellentmondásra jutni.
A lényeg, hogy a classAttrib az osztályhoz ad attribútumot nem pedig az objektumhoz. Az alapkoncepció pedig, hogy az azonos osztályú objektumok egyformák. Olyanok, mint amilyennek leírja őket az osztályuk. Ez így van a Jávában, C#-ben, C++-ban.
Vannak asszociatív tömbjeink is, ezeket egyrészt az objektumokhoz hasonlóan lehet használni, másrészt egyedileg bármit beléjük lehet tenni. Objektumalapú nyelvekben gyakran erre építik az objektumrendszert, a metódus egy lambda fv., amit a rendszer automatikusan kiértékel.
--
CCC3