Hoppa till innehållet

Polymorfism (objektorienterad programmering)

Från Wikipedia

Polymorfism innebär inom objektorienterad programmering att flera olika subklasser under en superklass kan ha ett gemensamt gränssnitt. Det innebär att klasser med olika behov vad gäller implementering av en viss metod, ändå kan anropas på samma sätt. Antag att klasserna Turtle och Hare båda är subklasser till klassen Animal. I sådana fall kan metoder som är gemensamma för haren och sköldpaddan samlas i klassen Animal, till exempel en metod som skriver ut den aktuella hastigheten med vilken djuret rör sig. Det finns också egenskaper hos en sköldpadda och en hare som är gemensamma, men som inte kan implementeras på samma sätt i de båda klasserna, till exempel springer en hare mycket fortare än en sköldpadda. Sådana metoder lämpar sig mycket väl för att implementeras polymorfiskt.

Följande är ett exempel på en arvshierarki i programmeringsspråket C++ där funktionerna run() och walk() används polymorfiskt:

#include <iostream>
#include <string>
class Animal 
{
	protected:
		std::string name;
		int speed;
	public:
		Animal(int s, std::string n);
		void print_current_speed();
		void virtual run() = 0;
		void virtual walk() = 0;

};
Animal::Animal(int s, std::string n) 
{
	speed = s;
	name = n;	
}
void Animal::print_current_speed() {std::cout << "Djuret " << name << " har hastigheten " << speed << std::endl;}

class Turtle: public Animal 
{
	public:
		Turtle();
		void run();
		void walk();
};

Turtle::Turtle(): Animal(1, "Sköldpadda"){}
void Turtle::run() {speed++;}
void Turtle::walk() {speed--;}

class Hare: public Animal 
{
	public:
		Hare();
		void run();
		void walk();
};
Hare::Hare(): Animal(1, "Hare"){}
void Hare::run() {speed = speed + 10;}
void Hare::walk() {speed = speed - 10;}

int main(int argc, char** argv) 
{
	Animal *animal_arr[2];
	animal_arr[0] = new Turtle();
	animal_arr[1] = new Hare();
	
	for(int i = 0; i < 2; i++)
	{
		animal_arr[i]->print_current_speed();
		animal_arr[i]->run();
		animal_arr[i]->print_current_speed();
		animal_arr[i]->walk();
		animal_arr[i]->print_current_speed();

	}
	
	return 0;
}

Ovan defineras de tre klasserna och metoderna implementeras, i huvudprogrammet skapas sedan en array som håller pekare till ett objekt av typen Hare och ett objekt av typen Turtle. Sedan skapas en for-loop som itererar över arrayen och anropar metoden print_current_speed() för att sedan anropa de polymorfa metoderna run() och walk() som höjer respektive sänker djurets hastighet. Där emellan anropas print_current_speed() för att kontrollera att hastigehten verkligen förändras. Detta program ger utskriften:

Djuret Sköldpadda har hastigheten 1
Djuret Sköldpadda har hastigheten 2
Djuret Sköldpadda har hastigheten 1
Djuret Hare har hastigheten 1
Djuret Hare har hastigheten 11
Djuret Hare har hastigheten 1