Ohjelmointiharjoitus 4: osa-kokonaisuus -rakenteet

Osatehtävä 1: Luokka Osa

Tee luokka Osa, jolla on ominaisuudet nimi, aliosat ja kokonaisuus. Ominaisuus nimi on tyypiltään merkkijono.

Ominaisuus aliosat on tyypiltään Set ja se sisältää välittömät alemman tason osat. Jos tämä osa on yksinkertainen osa (eli se ei koostu pienemmistä osista), on joukko aliosat tyhjä. Ominaisuus kokonaisuus on ominaisuuden aliosat käänteisrelaatio, eli kuvaa sen osan, johon tämä osa välittömästi sisältyy.

Tee ominaisuuksille hakumetodit nimi(), aliosat() ja kokonaisuus().

Tee luontimetodi, joka ottaa parametrinaan osan nimen. Alussa osa ei sisällä aliosia, eikä sisälly muihin osiin.

Osatehtävä 2: Metodi lisääAliosa

Tee metodi lisääAliosa(Osa uusi), joka lisää annetun osan uusi tämän osan välittömäksi aliosaksi. Huomaa, että käänteisrelaatiota pitää myös päivittää.

Osatehtävä 3: Metodi poistaAliosa

Tee metodi poistaAliosa(Osa poistettava), joka poistaa annetun osan poistettava tämän osan välittömistä aliosista. Myös tässä on käänteisrelaatiota päivitettävä.

Osatehtävä 4: Metodi toString ja pääohjelmametodi

Tee toString()-metodi, joka palauttaa kuvauksen jossa on osan nimi sekä välittömien aliosien nimet, esim. tyyliin:

Osa x, aliosat a, b, c
      

Tee pääohjelmametodi, joka luo yksinkertaisen osa-kokonaisuus -rakenteen ja tulostaa sen osien kuvaukset.

Osatehtävä 5: Metodi sisältyykö(Osa x)

Tee rekursiivinen metodi sisältyykö(Osa x), joka tarkistaa sisältääkö tämä osa aliosanaan (välittömänä tai välillisenä) annetun osan x.

Osatehtävä 6: Metodi kaikkiAliosat()

Tee rekursiivinen metodi kaikkiAliosat(), joka palauttaa joukon, joka sisältää tämän osan kaikki aliosat (välilliset ja välittömät).

Osatehtävä 7: Metodi kaikkiYksinkertaisetAliosat()

Yksinkertainen osa on sellainen, jolla ei ole yhtään aliosaa. Tee rekursiivinen metodi kaikkiYksinkertaisetAliosat(), joka palauttaa joukon, joka sisältää tämän osan kaikki yksinkertaiset aliosat (välilliset ja välittömät).

Osatehtävä 8: Ominaisuus paino

Määritä luokalle Osa ominaisuus double paino ja tälle hakumetodi. Tee luokalle toinen luontimetodi, joka ottaa nimen lisäksi parametrinaan myös painon. Tällä luontimetodilla on tarkoitus luoda yksinkertaisia osia, joiden paino annetaan luotaessa. Monimutkaisten osien paino on niiden aliosien painojen summa. Muuta metodeja lisääAliosa ja poistaAliosa niin, että ne päivittävät ominaisuutta paino.