Az Io egy prototípus alapú nyelv, osztály helyett prototípusról beszélünk. A prototípus és az osztály fogalma nem összetévesztendő: A prototípus egy objektum, ami egy másik objektum klónozásával jött létre; és üzeneteket küldhetünk neki. Az osztály ezzel szemben egy minta, ami alapján objektumokat tudunk létrehozni.
Minden objektum valamely más objektum klónja, nem pedig valamely osztály példánya.
Az objektumoknak slotjaik vannak. Egy objektum slotok
halmaza. A slot egy értéket tárol, amit egy kulcs azonosít. A kulcs
egy szimbólum, mely egyedi és nem megváltoztatható. Az érték típusa
tetszőleges. Egy slot az első rá hivatkozó írási műveletkor jön
létre. Egy slot értékét úgy lehet megkapni, ha elküldjük az
objektumnak a slot nevét. A type
slot visszaadja egy
objektum prototípusát, ami szintén egy objektum.
Ha egy objektum neve nagybetűvel kezdődik, akkor ő valójában típust
jelöl, és rendelkezik a type
slottal. Az ilyen objektumot
nevezzük prototípusnak. Ha egy objektum neve kisbetűvel
kezdődik, akkor ő valójában egy példány, amely ugyan
type
slottal nem rendelkezik, de elküldve neki a
type
üzenetet az ő prototípusa (amiből klónoztuk)
type
slotjának az értékét kapjuk. Minden objektum (típus
vagy példány) klónozással jön létre, méghozzá úgy, hogy egy már
meglévő objektumnak elküldjük a clone
üzenetet. Minden
objektumnak van prototípusa, egy objektumnak több protípusa is lehet
(Többszörös öröklődés)!
A gyökér szintű objektum az Object
.
Az Io névtér objektuma a Lobby
. Itt található minden
névvel ellátott objektum.
Klónozáskor meghívódik az új pédány init
nevű slotja,
amennyiben van neki ilyen.
Az object reflection segítségével metainformációkat szerezhetünk egy objektumról és annak slotjairól.
slotNames
: milyen slotjai vannak az objektumnak proto
/protos
: mi(k) az objektum prototípusa(i)getSlot
: metódust, ill. blokkot tartalmazó slot
tartalma (anélkül, hogy a metódus, ill. blokk meghívásra kerülne)code
: metódus, ill. blokk forráskódjaA metódusok névtelen függvények, hatáskörkezelésük dinamikus. Az alapértelmezett visszatérési érték az utoljára kiértékelt kifejezés eredménye lesz.
Metódust létrehozni az Object method()
-jével lehet.
Metódus létrehozása általánosan:
Metódus hívásakor (üzenetküldéskor) létrejön egy lokális objektum a
lokális tagok tárolására, mely objektum self
és
proto
slotja is a címzett objektumra állítódik.
A blokkok is névtelen függvények, azonban hatáskörkezelésük statikus.
Blokkot létrehozni az Object block()
-jával lehet.
Blokk létrehozása általánosan:
Blokk hívásakor (üzenetküldéskor) létrejön egy lokális objektum a
lokális tagok tárolására, mely objektum self
és
proto
slotja is a blokkot létrehozó objektumra
állítódik.
Mivel nincsenek osztályok, nincs különbség egy gyerek és egy példány között. Példa egy "gyerekosztály" létrehozására:
Io> Dog := Object cloneA fenti kód beállítja a Lobby "Dog" slotját, mint az Object objektum klónját. Megjegyzendő, hogy ez csak egy proto slotot tartalmaz. A Dog mostantól lényegében egy "alosztálya" az Object-nek. Példányváltozók és -metódusok öröklődnek a proto-tól. Ha egy slotot beállítunk, létrejön egy új slot a mi objektumunkban a proto megváltozása helyett:
Io> Dog color := "red" Io> Dog Object_0x4a7c0: (Többszörös öröklődés
Egy objektum delegálhat üzeneteket a "parent" slotján keresztül is. Amikor felelni kell egy üzenetre, a kereső mechanizmus először a proto-láncban keres, utána a "parent" slot hasonló láncán megy végig. Találat esetén továbbítja az üzenetet az objektumnak. Amíg a proto slotnak kötelező egy Object primítívre mutatnia, addig a parent slot mutathat bármelyik más típusú primitívre, például Number-re vagy String-re is.
Továbbítás
Ha egy objektum nem reagál egy üzenetre, meghívja a "forward" metódusát, amennyiben ilyen rendelkezésre áll. Az üzenet neve és argumentumai lekérdezhetőek a "thisMessage" slotbeli Message objektumtól.
MyObject forward := method(Super
Néha szükség lehet arra. hogy egy üzenetet közvetlenül a proto-nak küldjünk. Például:
Dog bark := method("woof!" print)
myDog := Dog clone
myDog bark := method(