Minden osztálydefiníció egy file-ban kell szerepeljen, de egy file-ban több osztályleírást is elhelyezhetünk. Osztályt definiálni a következőképpen tudunk:
class <típus> [ inherits <típus> ] is
<tulajdonságok>
end;
Minden osztály globális láthatósággal rendelkezik. Az osztálynevek nagy betűvel kell kezdődjenek, az osztályok nem újradefiniálhatók.
Az osztálydefiníció törzse tulajdonságok (attribútumok és metódusok)
listáját tartalmazza.
A Cool a legegyszerűbb módon támogatja az információrejtést: minden attribútum
lokális, minden metódus globális láthatósággal rendelkezik.
A tulajdonságnevek kis betűvel kell kezdődjenek. Egy
osztályon belül sem két metódus, sem két attribútum nem definiálható azonos
néven, de egy metódus és egy attribútum lehet azonos nevű.
Egy példa:
class Cons inherits List is
xcar : Int;
xcdr : List;
isNil() : Bool is false end;
init(hd : Int, tl : List) : Cons is
begin
xcar <- hd;
xcdr <- tl;
self;
end
...
end;
Itt a Cons osztálynak két attribútuma (xcar és xcdr), valamint két metódusa
(isNil és init) van. Mint látható, a típust minden esetben meg kell adni.
A new <osztálynév> utasítás segítségével
hozhatunk létre objektumokat. így például a
(new Cons).init(1, new Nil)
utasítás helyes (a Nil a List egy altípusa). Nincs szükség az objektumok megszüntetésére, az automatikus szemétgyűjtés megsemmisíti a felesleges adatokat.
Az osztálydefinícióban csak egy típust adhatunk meg szülőként. A gyermek a
szülő minden tulajdonságát örökli. A metódusok bizonyos korlátozásokkal
felüldefiniálhatók, az attribútumok nem.
Az Object osztály különleges, ha nem adunk meg szülőt, akkor
automatikusan ez lesz az. A körkörös öröklődés nem megengedett.