Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Olio vs. tietue

User137 [15.01.2013 07:48:03]

#

(Mod. siirsi toisesta keskustelusta.)

Onko muuten C++ miten uniikki kieli siinä, että olio on käytännössäkin kuin tietue? Useissa kielissä olio-muuttuja on aina pointteri, ilman että sitä tarvitsee erikseen ilmoittaa.

Muutenvaan näytän:

caption:=inttostr(sizeof(form1)); // 4
caption:=inttostr(sizeof(pointer(dword(form1))^)); // 0

Pascal:ssa ei ole edes mahdollista tietää olion muistinvarausta, toisin kuin record (struct) tyypistä. Javassa se on ehkä mahdollista jossain määrin.

Metabolix [15.01.2013 16:45:11]

#

Minusta useimmissa kielissä olio ja tietue ovat lähes sama asia, ja useinhan näitä ei ole edes eroteltu vaan on vain jompikumpi (kuten Javassa vain luokat). Enemmänkin voitaisiin puhua siitä, pitääkö osoittimet erikseen merkitä tai mitä kielissä tapahtuu automaattisesti. Kuten sanoit, joissain kielissä olioita ei voi käsitellä ilman osoittimia, ja silloin on tietysti helpompi jättää osoitinmerkinnät kokonaan pois.

C++:n ratkaisu on, että struct ja class tarkoittavat käytännössä ihan samaa. Tämä on järkevää kielen yhtenäisyyden kannalta: kun kerran osoittimet ovat jo olemassa ja toimivat tietueen kanssa yhdellä tavalla, on järkevää, että ne toimivat luokkien kanssa samalla tavalla.

Pascal on epäonnistunut vastaesimerkki, koska perinteinen Pascal ei sisällä luokkia missään muodossa ja sen eri murteet taas sisältävät niitä erilaisissa muodoissa. Delphin tyylinen class toimii aina osoittimen kautta, mutta sen sijaan Free Pascalin object toimii tietueen tavoin. Delphissäkin voi kikkailla tekemällä tietueen ja irtofunktioita, jolloin a.f(b) onkin f(@a, b).

User137 [15.01.2013 18:56:55]

#

Metabolix kirjoitti:

perinteinen Pascal ei sisällä luokkia missään muodossa ja sen eri murteet taas sisältävät niitä erilaisissa muodoissa. Delphin tyylinen class toimii aina osoittimen kautta, mutta sen sijaan Free Pascalin object toimii tietueen tavoin. Delphissäkin voi kikkailla tekemällä tietueen ja irtofunktioita, jolloin a.f(b) onkin f(@a, b).

Object tyyppi oli oikeastaan käytössä jo Delphissä, ja se freepascalissa mukana vain yhteensopivuuden vuoksi. Sillä koodaamista ei suositella missään tilanteessa, kun TObject luokka on jo vakiinnuttanut asemansa. He on kyllä tehneet viimeisimmissä versioissa mahdolliseks luoda funktioita recordille, ja saman teki Borland Delphille. Mahdollisti syntaksin operaattorien ylikuormitukselle, jonka fpc teki eri tavalla.

Muistelen että Javan kanssa käytettiin jotain "implements Serializable" tvs, jotta olio, mikä tahansa olio voi tallentaa itsensä tiedostoon sellaisenaan. Jäi vaan pintaraapasuks siihen tutustuminen.

On asialla kuitenkin ohjelmoijalle valtava merkitys, ymmärtää mitä taulukko olioita missäkin kielessä tarkoittaa. Mikä on yhdessä kielessä yhtenäinen muistitaulukko, on toisessa taulukollinen osoittimia sekalaisiin/toisistaan riippumattomiin muistipaikkoihin. Olio-ohjelmointi on kuitenkin käsitteenä yhtenäistynyt.

Triton [16.01.2013 14:41:40]

#

Oman käsitykseni mukaan tietue on käsitteenä vanhempi kuin luokka. Näin voitaisiin siis nähdä, että luokka - ainakin toteutuksen osalta - olisi kehittynyt tietueesta.

Tietueen suhde saattaa tosiaan olla hieman erilainen eri kielessä. Esim. C++:ssa näkisin, että struct on rakenteeltaan jollain tavalla "kevyempi" kuin class, vaikka sinäsä ne toimivatkin lähes täysin samalla tavalla.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta