Perusteellisestakin suunnittelusta huolimatta olio-ohjelmoinnissa tulee vastaan tilanteita, jolloin alkuperäisten luokkien ominaisuudet ja toiminnot ovat puutteellisia.
Luokan laajentaminen onnistuu kolmella tavalla:
check_circle Alkuperäisen luokan muuttaminen
check_circle Perintä, peritään alkuperäisestä luokasta uusi luokka, joka sisältää vanhojen ominaisuuksien lisäksi uudet tarvittavat ominaisuudet
check_circle Koostaminen, jolloin luokka joko käyttää toisen luokan ominaisuuksia ja toimintoja tai luokkaa laajennetaan siten, että se sisältää toisen luokan olion jäsenmuuttujana
Koostamisessa luokan sisällä käytetään toisen luokan olioita. Koostamiseen liittyy useita olio-ohjelmointiin liittyviä käsitteitä riippuen siitä minkä tasoisesta koostamisesta on kyse.
Alla olevassa esimerkissä on esitetty koostamiseen liittyvät tärkeimmät käsitteet: Assosiation, Aggregation ja Composition.
Toinen luokka "käyttää" toisen luokan olioita.
- opettajalla on henkilökortti tai opettaja käyttää henkilökorttia
- "luokkahuone käyttää opettajia ja oppilaita" ei kuulosta hyvältä mutta "luokkahuoneessa on yksi opettaja ja oppilaita" kuulostaa jo paljon paremmalta
Esimerkki: Assosiation.cs
Toinen luokka "sisältää" toisen luokan olioita.
- luokkahuone sisältää tietokoneita
- osasto sisältää opettajia
Esimerkki: Aggregation.cs
Toinen luokka "sisältää" toisen luokan olioita, jos käyttävä luokka poistuu, poistuu myös käytetty.
- rakennus sisältää luokkahuoneita
- JAMK sisältää osastoja
Esimerkki: Composition.cs
Alla on esitettynä muutama luokka havainnollistamaan luokkarakenteita ja yhteyksiä yllä esitetystä UML-kaaviosta:
Student-luokka periytyy Person-luokasta ja toteuttaa ILearning-rajapinnan
Classroom-luokka koostaa sisälleen Student-luokan oliota, Computer-luokan olioita, Teacher-luokan olio sekä sisältää oman RoomNumber-ominaisuuden:
Vaikea valinta
- Yleisesti vertailussa käytetään "is-a"- ja "has-a"-sääntöä
- Jos voidaan ajatella, että LuokkaA on LuokkaB (is-a), niin silloin kannattaa harkita perintää
- Jos taas voidaan ajatella, että Luokassa A on toinen luokka B, niin silloin kannattaa koostaa
Esimerkkejä:
- "Auto on Moottori", ei kuulosta hyvältä -> ei peritä
- "Autossa on Moottori", kuulostaa hyvältä -> koostetaan
- "Opettaja on Henkilö", kuulostaa hyvältä -> peritään
- "Opettajassa on Henkilö", ei kuulosta hyvältä -> ei koosteta
Valinta koostamisen ja perinnän välillä on vaikeasti havaittavissa. Yleisesti vertailussa käytetään "is-a"- ja "has-a"-sääntöä. Jos voidaan ajatella, että LuokkaA on LuokkaB (is-a), niin silloin kannattaa harkita perintää. Jos taas voidaan ajatella, että Luokassa A on toinen luokka B, niin silloin kannattaa koostaa.
Esimerkkejä:
grade "Auto on Moottori", ei kuulosta hyvältä -> ei peritä
grade "Autossa on Moottori", kuulostaa hyvältä -> koostetaan
grade "Opettaja on Henkilö", kuulostaa hyvältä -> peritään
grade "Opettajassa on Henkilö", ei kuulosta hyvältä -> ei koosteta
UML Class Diagrams: Reference
UML Class Diagrams: Guidelines