No Jarelta tuli yksi pointti. Joka pohjimmiltaan tarkoitti että oliolla voi olla sekä tietoa että toimintaa - jäsenmuuttujia ja jäsenfunktioita. Tässä yhteydessä tärkeä olio-ohjelmoinnin apuväline on tietojen piilotus. Olio tai luokka voi esim. omistaa tietoa, johon vain sillä itsellään (luokalla) on pääsy. Tätä hyväksikäyttäen voidaan olla varmoja, että olion sisäinen tila pysyy kunnossa, eikä luokkaa käytetä missään vaiheessa koodia väärin. Jäsenten näkyvyyttä ohjataan sanoilla public, private ja protected (unohda kokonaan sana friend, siitä ei tule kuin sanomista).iTKEVAnAKKI wrote:Jaksaisko joku kirjottaa pienen selostuksen miten olio-ohjelmointi helpottaa koodaamista? :p Ja sillain että tyhmempiki ymmärtää. Yritin lukee netistä mutta oli sellasta siansaksaa että huhhhuh...
Yksi tärkein tapa joka olio-ohjelmoinnissa helpottaa koodausta, on perinnöllinen polymorfismi*. Tämä tarkoittaa sitä, että luokat, jotka "päällepäin" näyttävät samoilta, voivat sisältää aivan erilaisen toteutuksen sisäisesti. Käytännössä tämä taas tarkoittaa sitä, että voit tehdä kantaluokan josta perit muita. Otetaan vaikka peliohjelmointiesimerkkinä Pelihahmo. Voit sitten periä tuosta luokasta erilaisia Pelihahmoja, kuten AgressiivinenPelihahmo, Pelaaja, Gargoyle tai vastaavaa. Niin monen tason verran kuin tarvitaan. Tämän jälkeen, voit kuitenkin laittaa nuo kaikki oliot yhteen ja samaan taulukkoon kun taulukon olioiden tyypiksi laitetaan Pelihahmo. Eli voit piirtää ja päivittää kaikkien Pelihahmojesi tilan yksinkertaisessa for-silmukassa, riippumatta siitä minkälainen olio se sattuukaan olemaan.
Pieni koodiesimerkki (ei käänny vaikka kuinka yrittäisi ):
Code: Select all
class Pelihahmo
{
public:
void virtual Update(long gameTime)
{
}
void virtual Draw(GraphicsContext graphics)
{
graphics.Draw( _texture, _locationAndSize );
}
private:
Rectangle _locationAndSize;
Texture2 _texture;
};
class Pelaaja : public Pelihahmo
{
public:
int GetHitPoints()
{
return _hitPoints;
}
private:
int _hitPoints;
};
class Gargoyle : public Pelihahmo
{
//update the gargoyle like behaviour in the update method...
};
....
Pelihahmo gameObjects[] = new Pelihahmo[5];
gameObjects[0] = new Pelaaja();
gameObjects[1] = new Gargoyle();
gameObjects[2] = new Pelihahmo(); //Some generic character which just stands still :)
gameObjects[3] = new Gargoyle();
gameObjects[4] = new Gargoyle();
...
for(int i=0; i<5; i++)
{
gameObjects[i].Update(elapsedTicks);
gameObjects[i].Draw(graphics);
}
...
*Polymorfismi voi tarkoittaa myös sitä, että funktiolle tai metodille (jäsenfunktio) voidaan antaa erilaisia parametreja, ja funktio valitaan niiden perusteella. Mutta tämä ei ole olio-ohjelmoinnin ominaisuus, vaan löytyy monista muunkin tyyppisistä kielistä. Esimerkiksi voidaan esitellä funktiot Print(int number) ja Print(string text). Kun kutsutaan Print(344) ja Print("344"), kutsutaan eri funkioita. Tällä tavalla voidaan erilaisen tiedon käsittely samankaltaistaa. Tavasta esitellä saman nimisiä funkioita eri parametreilla käytetään nimitystä kuormitus.