Oliot ja tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 19. maaliskuuta 2007
Olion tyyppi? attribuutti on oikeastaan metodi, jonka arvo ei riipu itseviitteestä luokkapohjaisessa kielessä attribuuteilla ja metodeilla on olennainen lisäero: joka oliolla on omat attribuuttinsa saman luokan olioilla on yhteiset metodit olion tyypissä nämä on siksi eroteltava merkitään oliotyyppiä [v 1 : T v1,..., v k : T vk, m + 1 : T m + 1,..., m+ n : T m + n ] v i ovat attribuutteja m + i ovat metodeja metodisuutta merkitään siis yläindeksiplussalla attribuutteihin voi sijoittaa, metodeihin ei
Abstrakti syntaksi E ::= [I 1 = E 1,..., I k = E k, I k+1 = ςi k+1.e k+1,..., I n = ςi n.e n] E.I E 1.I := E 2 T ::= [I 1 : T 1,..., I k : T k, I + k+1 : T k+1,..., I n + : T n] V ::= L X ::= E L
pohjalla arvovälitteinen Systeemi F ω <: laajennettuna µ-tyypeillä vanhoihin laskentasääntöihin seuraavat muutokset: jokainen E muutetaan X :ksi jokainen muotoa _ _ oleva reduktiorelaatio muutetaan muotoon (_, σ) (_, σ ) uusille konstruktiolle laskentasäännöt; sotkuisia mutta eivät hankalia
Oliotyypin alityypitys uusia attribuutteja saadaan lisätä uusia metodeja saadaan lisätä attribuutit alityypittyvät invariantisti metodit alityypittyvät kovariantisti esimerkki: [n : Int, inc + : (), dec + : ()] <: [n : Int, inc + : ()]
Rekursiiviset oliotyypit oliotyypit ovat usein rekursiivisia; esim. µt.[n : Int, max + : T ()] toinen esimerkki: µt.[n : Int, max + : T (), min + : T ()]
Kysymys Määritellään lyhennysmerkinnät T 1 = µt.[n : Int, equals + : T Bool] T 2 = µt.[n : Int, equals + : T Bool, inc + : ()] Onko T 2 <: T 1? Vastaus Oletetaan, että vastaus on kyllä. Tällöin pätee T 2 Bool <: T 1 Bool, koska metodit alityypittyvät kovariantiksi. Tällöin pätee myös T 1 <: T 2, koska parametrit alityypittyvät kontravariantisti. Toisaalta T 1 <: T 2 ei voi päteä, koska T 2 :ssa on enemmän metodeja kuin T 1 :ssä. Näin ollen T 2 ei ole T 1 :n alityyppi!
Binäärimetodien ongelma binäärimetodiksi sanotaan metodia, joka ottaa parametrina viittauksen toiseen samantyyppiseen olioon tyypillinen esimerkki on equals-metodi ongelma: jos oliotyypissä on binäärimetodi, sillä ei ole (epätriviaaleja) alityyppejä! Javan (hätä)ratkaisu: parametrina ei annetakaan samantyyppistä oliota vaan viittaus johonkin ylätyypin olioon tällöin esim. equals-metodissa on toimitettava dynaaminen tyyppitarkastus if (!(o instanceof ThisClass)) return false; Eiffelin (hätä)ratkaisu: annetaan parametrien alityypittyä kovariantisti ei tyyppiturvallista onko olemassa toimivaa ratkaisua?
Ratkaisu 1: Multimetodit otetaan metodit pois oliosta metodeista tulee näin olennaisesti tavallisia funktioita sallitaan metodien dynaaminen overloading : suoritettava metodi valitaan argumenttien ajonaikaisten tyyppien mukaan ei kovin oliomaista hankala toteuttaa tehokkaasti esim. CLOS, MultiJava
Ratkaisu 2: Sopivuus unohdetaan alityypitys uusi tyyppien välinen relaatio sopivuus (engl. matching), merkitään <# olennainen ero alityypitykseen on, että subsumptioperiaate heitetään romukoppaan oliotyypeillä T 1 ja T 2 pätee T 1 <# T 2, jos T 1 :llä on ainakin samat attribuutit ja metodit kuin T 2 :lla ei kuitenkaan sallita tyyppien muuttamista PolyTOIL, LOOM
Sopivuus, osa 2 T 1 <# T 2 ei tarkoita, että T 1 :stä voitaisiin käyttää T 2 :n tilalla esimerkiksi T 1 ei kelpaa argumentiksi jos T 2 :a odotetaan ratkaisu on sopivuus-rajoitettu geneerisyys: t <# T.t tällaiselle funktiolle saa antaa parametriksi mitä tahansa, joka sopii T :hen!
Sopivuus, osa 3 T 1 <# T 2 ei tarkoita, että T 1 :stä voitaisiin käyttää T 2 :n tilalla esimerkiksi vaikka TextField <# Component, ei TextField kelpaa Array Component:n alkioksi ratkaisu on edelleen sopivuus-rajoitettu geneerisyys: Array ( t <# T.t)