Jos käytät Scalan rakenteita, joita ei ole vielä luennoilla käsitelty, kommentoi ohjelmasi kunnolla! Varaudu myös selittämään, miten olet ohjelmoinut ja mitä ohjelmatekstisi tarkoittaa!
trait KoristellenTulostettava {
def koristettava: String
def koristemerkki: Char
def reunusta = println(koristemerkki + koristettava + koristemerkki)
//... alleviivaa, ylleviivaa, ymparoi, ...
}
class Kuka(var nimi: String) extends KoristellenTulostettava {
override def koristettava = nimi
override val koristemerkki = '*'
}
val pm = new Kuka("Putin")
pm.reunusta // *Putin*
pm.nimi = "Obama"
pm.reunusta // *Obama*
class Luku(var arvo: Int) extends KoristellenTulostettava {
override def koristettava = " " + arvo * 2 + " "
override def koristemerkki = math.abs(arvo)%256 toChar
}
val se = new Luku(42)
se.reunusta // * 84 *
se.arvo = 93
se.reunusta // ] 186 ]
se.arvo = -3301
se.reunusta // å -6602 å
Laajenna siis koristelutyylejä ainakin noilla luetelluilla:
alleviivaa, ylleviivaa, ymparöi. Keksi lisää itse.
Anna muitakin käyttöesimerkkejä kuin luokat Kuka ja Luku.
Voit kehitellä myös muita esimerkkejä, jotka paremmin valaisevat tätä tekniikkaa.
class Opiskelija(val nimi: String,
var harjoitusPisteet: Int,
var koePisteet: Int
) {
def kokonaisPisteet = harjoitusPisteet + koePisteet
override def toString = nimi + ": " + kokonaisPisteet
}
abstract class OpiskelijaJoukko {
def vie(x: Opiskelija): Unit
def poista(x: Opiskelija): Unit
}
class ToteutettuOpiskelijaJoukko extends OpiskelijaJoukko {
import scala.collection.mutable.HashSet
private val joukko = new HashSet[Opiskelija]
def vie(x: Opiskelija) {joukko += x}
def poista(x: Opiskelija) {joukko -= x}
override def toString = joukko.toString
}
val masa = new Opiskelija("Matti Mainio", 7, 36)
println(masa.kokonaisPisteet) // 43
val kurssi = new ToteutettuOpiskelijaJoukko
val jusa = new Opiskelija("Jussi Juonio", 2, 18)
kurssi.vie(masa)
kurssi vie jusa
kurssi vie new Opiskelija("Saku Sammakko", 19, 23)
println(kurssi) // Set(Saku Sammakko: 42, Matti Mainio: 43, Jussi Juonio: 20)
kurssi poista jusa
println(kurssi) // Set(Saku Sammakko: 42, Matti Mainio: 43)
Laadi OpiskelijaJoukko-luokan alityyppeinä seuraavat
piirretyypit, jotka (yhdessä tai erikseen) on tarkoitettu
liitettäviksi erilaisiin OpiskelijaJoukko-luokan
konkreettisten aliluokkien avulla muodostettuihin uusiin luokkiin:
Näitä piirretyyppejä käytetään siis luentomateriaalin esimerkkien tapaan uusien luokkien muodostamiseen tyyliin
val p = new ToteutettuOpiskelijaJoukko extends Koeleikkuri
p vie new Opiskelija("Saku Sammakko", 19, 23)
...
val v = new ToteutettuOpiskelijaJoukko with Koeleikkuri with OnnilleViisPlus
Havainnollista esimerkein ja selitä, millaisia luokkia
näiden piirretyyppien avulla saadaan muodostettua.
Vaikuttaako piirretyyppien liittämisen järjestys muodostettavien
luokkien toimintaan? Jos vaikuttaa, selitä miten vaikuttaa.
Ellei vaikuta, miksi ei?
Lay-outin suhteen kätesi ovat kuitenkin vapaat.