classAttrib

Fórumok

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:


class proba(object)

function main()
local o:=probaNew()
local clid:=getclassid(o)

    o:liststruct //régi struktúrta

    classAttrib(clid,"hoho")
    o:liststruct //új struktúrta (hoho-val bővítve)

    //az itteni o még a régi struktúrájú,
    //az attribútumokat tartalmazó tömbben nincs hely a hoho-nak    
    //o:hoho:="próba szerencse" //-> size error
    
    o:=probaNew()
    o:hoho:="próba szerencse" //új objektum, új struktúrával, Ok

Nem lehetne az Object abstract-ba felvenni egy addAttrib és addMethod metódust?

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

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