You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

Periytyminen

Toinen oleellinen perustekniikka olio-ohjelmoinnissa koostumisen lisäksi on periytyminen. Periytymisellä tarkoitetaan, että luokka voi 'periä' toisen luokan kaikki ominaisuudet ja toiminnallisuudet (ja muokata niitä, sekä lisätä niihin omiaan). Tämä edistää koodin uudelleenkäyttöä, sillä tällä tekniikalla voimme hyödyntää jo olemassa olevaa koodia, mutta lisätä siihen tarvittavat uudet ominaisuudet tai muuttaa perittyjä osia.

Periyttämisestä käytetään myös nimeä erikoistaminen (specialization) ja vastaavasti yhteisten metodien ja muuttujien siirtämistä omaan luokkaansa kutsutaan yleistämiseksi (generalization). Perimimisjärjestyksessä aikaisempaa luokkaa kutsutaan vanhemmaksi (parent) ja siitä perivää luokkaa lapseksi (child).

Periytyminen C++:ssa esitetään seuraavasti:

class Perillinen : [määre] Vanhempi
{
...
}

jossa [määre] on yleensä public (joskus harvoin protected tai private).

Esimerkki 1. Periytyminen.

Seuraavassa on esitetty ensin luokka CElain:

class CElain
{
private:   // saatavissa vain luokan funktioilla
    char m_Kutsumanimi[100];
    float m_Massa;

public:   // voidaan käyttää luokan ulkopuolelta
    void AsetaNimi(char Nimi[]);
    char* KysyNimi();
    void AsetaMassa(float Massa);
    float KysyMassa();
};

Seuraavaksi on erikoistettu luokka, joka esittää eläintä kissa, siihen sisällytetään kaikki vain kissalle ominaiset piirteet.

class CKissa : public CElain
{
private:   // saatavissa vain luokan funktioilla

public:   // voidaan käyttää luokan ulkopuolelta
    void Kehraa();
};

Luokka CKissa perii kaikki CElain-luokan ominaisuudet ja toiminnallisuudet (=jäsenmuuttujat ja -funktiot). Mutta ainoastaan protected ja public-tyyppisiin päästään käsiksi CKissa-luokassa. Kts. näkyvyys.


Kuva 1. Esimerkki 1 UML-muodossa esitettynä.

Vanhemman funktioiden ylikirjoitus perillisessä

Perityn luokan funktoita voidaan ylikirjoittaa perillisessä. Kutsuttaessa funktoita perillisen olion kautta suoritetaan perillisessä ylikirjoitettu funktio.

Esimerkki 2. Funktion ylikirjoitus perillisessä.

#include <iostream>

using namespace std;

class CElain
{
public:   // voidaan käyttää luokan ulkopuolelta
    void TulostaLuokanNimi()
    {
        cout << "Luokan nimi on CElain." << endl;
    }
};

class CLehma : public CElain
{
public:
    void TulostaLuokanNimi()
    {
        cout << "Luokan nimi on CLehma." << endl;
    }
};

int main()
{
    CLehma lehma;
    lehma.TulostaLuokanNimi();

    CElain elain;
    elain.TulostaLuokanNimi();
}


Kuva 2. Esimerkin 2 UML-kaavio.

Testatkaa mitä main():ssa tehdyt funktiokutsut tulostavat.

  • No labels
You must log in to comment.