Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Polymorfismi

Polymorfismilla tarkoitetaan olioiden käsittelyä kantaluokan kautta. Kantaluokka on luokka, jonka olion luokka on perinyt. Täten kantaluokka muodostaa yhteisen rajapinnan perillisten käsittelyyn.

Esimerkki 1: Olioden käsittely kantaluokan kautta.

CElain:

Code Block
Wiki Markup
h2. Polymorfismi

Polymorfismilla tarkoitetaan olioiden käsittelyä kantaluokan kautta. *Kantaluokka* on luokka, jonka olion luokka on perinyt. Täten kantaluokka muodostaa yhteisen rajapinnan perillisten käsittelyyn.

h3. Esimerkki 1: Olioden käsittely kantaluokan kautta.

CElain:
{code}
// Kantaluokka CElain
class CElain
{
public:
    virtual ~CElain() {}          // Hajoittimen toteutus tulee olla (tyhjäkin käy).
    virtual void Aantele() = 0;   // Aito virtuaalifunktio, pakko toteuttaa perillisissä.
};
{code}

CKissa:

{
Code Block
}
// Perillinen, joka toteuttaa Aantele()-funktion
class CKissa : public CElain
{
public:
    void Aantele() { printf("Miau!\n"); }
};
{code}

CKoira:

{
Code Block
}
// Perillinen, joka toteuttaa Aantele()-funktion
class CKoira : public CElain
{
public:
    void Aantele() { printf("Vuh!\n"); }
};
{code}

main:

{
Code Block
}
int main()
{
    CKissa kissa;              // Luodaan uusi olio CKissa-luokasta.
    CKoira koira;              // Luodaan uusi olio CKoira-luokasta.
    CElain* elain;             // Luodaan CELain-tyyppinen osoitin eli kantaluokan tyyppinen osoitin.

    elain = &kissa;            // Pistetään CElain-tyyppinen osoitin osoittamaan olioon kissa.
    elain->Aantele();          // Kutsutaan CKissa-luokassa toteutettua Aantele()-metodia.

    elain = &koira;            // Pistetään CElain-tyyppinen osoitin osoittamaan olioon koira.
    elain->Aantele();          // Kutsutaan CKoira-luokassa toteutettua Aantele()-metodia.
}
{code}

Esimerkissä

...

luodaan

...

oliot

...

CKissa

...

-

...

sekä

...

CKoira-luokista.

...

Lisäksi

...

luodaan

...

CElain-tyyppinen

...

osoitin.

...

Tämän

...

osoittimen

...

kautta

...

voidaan

...

käsitellä

...

kaikkia

...

CElain-luokan

...

esittelemiä

...

(public

...

ja

...

protected)

...

metodeja,

...

kuten

...

Aantele()-metodia.

...

CElain-luokka

...

toimii

...

yhteisenä

...

rajapintana

...

CKissa

...

ja

...

CKoira

...

-luokille.

...

Image Added
Kuva 1.

...

Esimerkki

...

1

...

UML-luokkakaaviona.

...

Esimerkki

...

2:

...

Virtuaalifunktioiden

...

merkitys

{
Code Block
}
#include <stdio.h>

class CElain
{
public:
	        void f()  { printf("CElain::f()\n"); }
	virtual void fv() { printf("CElain::fv()\n"); }
};
{
Code Block
}
{code}
class CKissa : public CElain
{
public:
	void f()  { printf("CKissa::f()\n"); }
	void fv() { printf("CKissa::fv()\n"); }
};
{
Code Block
}
{code}
int main()
{
	printf("CElain-tyyppisen osoittimen kautta käyttäen:\n");
	CElain* e = new CKissa;
	e->f();
	e->fv();

	printf("CKissa-tyyppisen osoittimen kautta käyttäen:\n");
	CKissa* k = new CKissa;
	k->f();
	k->fv();
}
{code}

Ohjelma

...

tulostaa::

{
No Format
}CElain-tyyppisen osoittimen kautta käyttäen:
CElain::f()
CKissa::fv()
CKissa-tyyppisen osoittimen kautta käyttäen:
CKissa::f()
CKissa::fv()
{noformat}
h2. 

Idea?

...

polymorfismista

...

Yksi

...

tapa

...

hahmottaa

...

polymorfismi

...

on

...

ajatella

...

olioita

...

substantiiveina.

...

Esimerkiksi

...

esineitä,

...

jotka

...

ovat

...

pöydällä:

...

kahvikuppi,

...

lehti,

...

lautanen.

...

Kaikkiin

...

näihin

...

voidaan

...

soveltaa

...

verbejä,

...

kuten

...

kaataa

...

kuppi,

...

lukea

...

lehti,

...

hajoittaa

...

lautanen,

...

jne.

...

On

...

myös

...

olemassa

...

verbejä,

...

jotka

...

soveltuvat

...

lähes

...

kaikkiin

...

substantiiveihin,

...

kuten

...

hae,

...

aseta,

...

siirrä.

...

Polymorfismilla

...

tarkoitetaan

...

'verbejä'

...

eli

...

funktioita,

...

jotka

...

tekevät

...

jotain

...

'substantiiveille',

...

eli

...

erilaisille

...

objekteille.

...

Tämä

...

onnistuu

...

ohjelmointikielissä

...

perinnän

...

kautta,

...

olioita

...

voidaan

...

käsitellä

...

tietämättä

...

eksaktia

...

luokkaa,

...

josta

...

ne

...

on

...

luotu,

...

kunhan

...

ne

...

kaikki

...

omaavat

...

saman

...

kantaluokan.