Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int SiivenPituus get return _siivenpituus; set _siivenpituus = value; public virtual double AivojenKoko get return _aivojenkoko; set _aivojenkoko = value; public bool OsaakoLentaa get return _osaakolentaa; set _osaakolentaa = value; //Konstruktorit public Lintu() _siivenpituus = 11; _aivojenkoko = 100; _osaakolentaa = false; class Pelikaani : Lintu //Kentät private int _nokankoko; private int _ika; //Ominaisuudet public override double AivojenKoko get return _aivojenkoko; set _aivojenkoko = value * 2; public int NokanKoko get return _nokankoko; set _nokankoko = value; //Konstruktorit public Pelikaani() // TEHTÄVÄN b-kohdan SISÄLTÖ TÄHÄN 1
class Program static void Main(string[] args) Lintu isolintu; Pelikaani petteri; isolintu = new Lintu(); petteri = new Pelikaani(); // TEHTÄVÄN a-kohdan SISÄLTÖ TÄHÄN a. Mitkä seuraavista lauseista ovat mahdollisia metodissa Main(): a. petteri._aivojenkoko = 3.2; b. petteri._siivenpituus = 7; c. petteri.osaakolentaa = true; d. petteri._ika = 3; e. petteri.nokankoko = 4; f. petteri.siivenpituus = 7; b. Mitkä seuraavista lauseista ovat mahdollisia konstruktorissa Pelikaani(): a. _aivojenkoko = 3.2; b. _siivenpituus = 7; c. OsaakoLentaa = true; d. _ika = 3; e. _nokankoko = 4; f. AivojenKoko = 1.2; g. SiivenPituus = 4; h. Lintu(); i. base(); 2. Olkoon olemassa seuraava luokka Piste: class Piste //Kentät private int _x; private int _y; //Ominaisuudet public int X get return _x; set _x = value; public int Y get return _y; set _y = value; //Konstruktorit public Piste(int x, int y) 2
_x = x; _y = y; //Metodit public override string ToString() return "(" + _x + ", " + _y + ")"; Ohjelmoi C# kielellä luokka PiirtoElementti: Kentät: _sijainti, johon tallettuu tieto piirtoelementin sijainnista koordinaatistossa (eli arvoksi tulee Piste olio) Ominaisuudet: Sijainti, jolla kapseloidaan kenttä _sijainti. Konstruktorit: PiirtoElementti(), jossa Piste tyyppinen parametri sijainti konstruktori asettaa kentän _sijainti arvoksi parametrissa sijainti välitetyn olion Metodit: ToString(), joka ylikirjoitetaan (määre override) perimässä (luokasta object) tulevasta ToString() metodista o palauttaa paluuarvonaan sijainnin koordinaatit merkkijonona muodossa sijainti: (x koordinaatti, y koordinaatti) esim. sijainti: (2, 5) Piirra(), joka määritellään ylikirjoitettavaksi määreellä virtual o sisältö jätetään toistaiseksi tyhjäksi 3. Ohjelmoi C# kielellä luokat Nelio ja Viiva, jotka erikoistetaan luokasta PiirtoElementti: 3
Luokka Nelio: kenttä _sarma sisältää neliön särmän (sivun) pituuden perimässä tuleva ominaisuus Sijainti kertoo neliön vasemman yläkulman koordinaatit ominaisuus Sarma on kentän _sarma käsittelyyn konstruktori Nelio(), jossa on kaksi parametria sijainti (Piste) ja sarma (int) o kutsuu kantaluokkansa konstruktoria antamalla argumentiksi parametrinsa sijainti o sijoittaa kenttään _sarma parametrin sarma arvon metodi ToString(), jolla ylikirjoitetaan (override) kantaluokan vastaava metodi o palauttaa arvonaan merkkijonona neliön tiedot muodossa: sijainti: (xkoordinaatti, y koordinaatti), sivun pituus: sarma esim. sijainti: (2, 5), sivun pituus: 4 huomaa, että paluuarvon osuus sijainti: (x koordinaatti, y koordinaatti) voidaan tuottaa kantaluokan ToString() metodilla. metodi Piirra(), jolla ylikirjoitetaan (override) kantaluokan vastaava metodi o sisältö jätetään toistaiseksi tyhjäksi Luokka Viiva: kenttä _loppupiste sisältää viivan loppupisteen koordinaatit (Piste olio) perimässä tuleva ominaisuus Sijainti kertoo viivan alkupisteen koordinaatit (Piste olio) ominaisuus LoppuPiste on kentän _ loppupiste käsittelyyn konstruktori Viiva(), jossa on kaksi parametria alkupiste (Piste) ja loppupiste (Piste) o kutsuu kantaluokkansa konstruktoria antamalla argumentiksi parametrinsa alkupiste (Piste olio) o sijoittaa kenttään _ loppupiste parametrin loppupiste arvon (Piste olio) metodi ToString(), jolla ylikirjoitetaan (override) kantaluokan vastaava metodi o palauttaa arvonaan merkkijonona neliön tiedot muodossa: alkupiste: (xkoordinaatti, y koordinaatti), loppupiste: (x koordinaatti, y koordinaatti) esim. alkupiste: (2, 5), loppupiste: (2, 9) alkupiste saadaan ominaisuudesta Sijainti. metodi Piirra(), jolla ylikirjoitetaan (override) kantaluokan vastaava metodi o sisältö jätetään toistaiseksi tyhjäksi 4
4. Tee luokka Osoite: merkkijonokentät _katuosoite, _postinro ja _postitoimipaikka ja niitä kapseloivat ominaisuudet Katuosoite, Postinro ja Postitoimipaikka konstruktori Osoite(), jossa ei parametreja eikä toiminnallisuutta ylikirjoitettu metodi ToString(), joka palauttaa Osoite olion merkkijonona muodossa: <katuosoite>, <postinumero> <postitoimipaikka> (esim. Tiedepuisto 3, 28600 PORI ). Tee abstrakti luokka Myyntikohde kentät _kohdeid (merkkijono), _osoite (Osoite), _rakennusvuosi (kokonaisluku) ja _arvo (desimaaliluku). Näkyvyysmääreenä kaikilla näillä on protected. konstruktori MyyntiKohde(), jossa parametrin os sisältämä Osoite olio sijoitetaan kenttään _osoite. abstrakti metodi TulostaTiedot() ( abstraktissa metodissa kirjoitetaan vain otsikko osa). 5. Periytä edellä tehdystä luokasta MyyntiKohde luokat OmaKotiTalo ja OsakeHuoneisto: 5
MyyntiKohde #_kohdeid : string #_osoite : Osoite #_rakennusvuosi : int #_arvo : double +MyyntiKohde(in os : Osoite) +TulostaTiedot() OmaKotiTalo -_omatontti : bool -_tontinkoko : double +KohdeId : string +Osoite : Osoite +RakennusVuosi : int +Hinta : double +OmaTontti : bool +TontinKoko : double +OmaKotiTalo(in os : Osoite) +TulostaTiedot() OsakeHuoneisto -_kerros : int -_yhtiovastike : double +KohdeID : string +Osoite : Osoite +RakennusVuosi : int +Hinta : double +Kerros : int +YhtioVastike : double +OsakeHuoneisto(in os : Osoite) +TulostaTiedot() Luokka OmaKotiTalo: periytetään abstraktista luokasta MyyntiKohde kentät _omatontti (totuusarvo) ja _tontinkoko (desimaaliluku) ominaisuudet kaikkien kenttien kapselointiin (eli sekä kantaluokan että varsinaisen luokan kenttien): KohdeId, Osoite,RakennusVuosi, Hinta, OmaTontti ja TontinKoko. o ominaisuuden KohdeId get metodissa palautetaan joko kentän _kohdeid arvo tai merkkijono N/A. Jälkimmäinen siinä tapauksessa, että kentän _kohdeid arvona on tyhjä merkkijono. konstruktori OmaKotiTalo(), jossa parametrina Osoite tyyppinen os ja toimintana kutsutaan kantaluokan (base) konstruktoria argumentilla os sekä asetetaan kentän KohdeId arvoksi tyhjä merkkijono. metodi TulostaTiedot(), joka tulostaa komentokehotteeseen olion tiedot seuraavasti: Omakotitalo: kohdeid: ominaisuuden KohdeId arvo osoite: ominaisuuden Osoite sisältämän olion ToString() rakennusvuosi: ominaisuuden RakennusVuosi arvo merkkijonona hinta: ominaisuuden Hinta arvo merkkijonona oma tontti: omin. OmaTontti arvon perusteella joko kyllä tai ei tontin koko: ominaisuuden TontinKoko arvo merkkijonona Luokka OsakeHuoneisto: periytetään abstraktista luokasta MyyntiKohde kentät _kerros (kokonaisluku) ja _yhtiovastike (desimaaliluku) ominaisuudet kaikkien kenttien kapselointiin (eli sekä kantaluokan että varsinaisen luokan kenttien): KohdeId, Osoite,RakennusVuosi, Hinta, Kerros ja YhtioVastike. o ominaisuuden KohdeId get metodissa palautetaan joko kentän _kohdeid arvo tai merkkijono N/A. Jälkimmäinen siinä tapauksessa, että kentän _kohdeid arvona on tyhjä merkkijono. (SAMOIN KUIN luokassa OmaKotiTalo) konstruktori OsakeHuoneisto(), jossa parametrina Osoite tyyppinen os ja toimintana kutsutaan kantaluokan (base) konstruktoria argumentilla os sekä asetetaan kentän KohdeId arvoksi tyhjä merkkijono. (SAMOIN KUIN luokassa OmaKotiTalo) metodi TulostaTiedot(), joka tulostaa komentokehotteeseen olion tiedot seuraavasti: 6
Osakehuoneisto: kohdeid: ominaisuuden KohdeId arvo osoite: ominaisuuden Osoite sisältämän olion ToString() rakennusvuosi: ominaisuuden RakennusVuosi arvo merkkijonona hinta: ominaisuuden Hinta arvo merkkijonona kerros: ominaisuuden Kerros arvo merkkijonona yhtiövastike: ominaisuuden YhtioVastike arvo merkkijonona 6. Jatka edellistä tehtävää toteuttamalla Main metodiin seuraava toiminnallisuus: Määrittele OmaKotiTalo tyyppinen muuttuja kohde 1 ja OsakeHuoneisto tyyppinen muuttuja kohde 2. Aseta molempiin arvoksi null. Ohjelma kysyy käyttäjältä haluaako tämä tehdä 1) Omakotitalo vai 2)Osakehuoneistokohteen. o jos käyttäjä valitsee 1, tehdään OmaKotiTalo olio (ks. alla) o jos käyttäjä valitsee 2, tehdään OsakeHuoneisto olio (ks. alla) o jos käyttäjä valitsee jotain muuta, tulostetaan teksti Et valinnut kumpaakaan OmaKotiTalo olion perustaminen: o pyydetään käyttäjältä omakotitalon osoite ja luodaan Osoite olio o luodaan OmaKotiTalo olio muuttujaan kohde1 o pyydetään loput tiedot lukuunottamatta KohdeId tietoa ja asetetaan ne OmaKotiTalo olion ominaisuuksiin Huomaa oman tontin kysymisen kohdalla, että käyttäjä syöttää merkin (K tai E). Tämän perusteella sijoitetaan ominaisuuteen OmaTontti arvoksi joko true tai false. OsakeHuoneisto olion perustaminen: o pyydetään käyttäjältä osakehuoneiston osoite ja luodaan Osoite olio o luodaan OsakeHuoneisto olio muuttujaan kohde2 o pyydetään loput tiedot lukuunottamatta KohdeId tietoa ja asetetaan ne OsakeHuoneisto olion ominaisuuksiin Lopuksi ohjelma tulostaa joko OmaKotiTalo olion tai OsakeHuoneisto olion sisällön metodilla TulostaTiedot() riippuen siitä, mikä olio on olemassa. Jos kumpaakaan ei ole olemassa, ei tulosteta enää mitään. 7
8