Arv
Arv är ett begrepp som främst används inom objektorienterad
programmering. Att ärva en klass innebär att man tar över de
egenskaper och operationer som klassen har med samma resultat som
om man skulle skriva av all källkod från klassen. Man använder arv
för att utöka en existerande klass. Det är mycket vanligt att man
skapar en generell klass som innehar egenskaper och operationer
som är gemensamma för en större grupp av klasser. Klasserna i
gruppen ärver sedan den generella klassen och varje klass lägger
endast till de saker som just den klassen behöver.
Följande Java-exempel visar hur arv kan användas. Vi ser två
klasser där klassen Cylinder ärver klassen
Cirkel .
class Cirkel
{
int radie;
int area()
{
return radie * radie * Math.PI;
}
}
class Cylinder extends Cirkel
{
int höjd;
int volym()
{
return area() * höjd;
}
}
Nyckelordet extends är Javas sätt att uttrycka arv.
Objekt av typen Cirkel har en instansvariabel, radie
och en metod, area . De egenskaper som en cirkel
besitter har även en cylinder. En cylinder är en något utökad
cirkel och har även en höjd och en volym vilket vi ser i koden i
form av en instansvariabel och en metod. Det kan se ut som om
cylindern endast har en höjd och en volym, men i och med arvet får
den alltså tillgång till radien och arean som definierats i
klassen för cirkeln på samma sätt som om vi kopierat koden till
cylinderklassen rakt av.
Vad är då poängen med detta? Jo, det fina är att vi nu slipper
skriva koden på två ställen. Skulle vi behöva uppdatera så är det
ju bra om vi kan ändra på bara ett ställe. Vi kan även tänka oss
att vi skapar ännu en klass, Klot som ju också är en
utökning av en cirkel.
class Klot extends Cirkel
{
int volym()
{
return (radie * radie * radie * Math.PI) / 3;
}
}
Vi ser att vi kan använda variabeln radie och metoden
area i både Cylinder och
Klot . Klasserna Cylinder och
Klot har dock ingen koppling till varandra. Vi kan
inte komma åt variabeln höjd i ett klot - för den
finns helt enkelt inte där.
Superklass och subklass
Cirkeln i exemplet ovan brukar kallas för superklass eller
föräldraklass. Det är alltså den klass som andra klasser ärver.
Cylindern och klotet kallas subklasser. Subklassen är den
klass som ärver - det är i subklassen vi hittar ordet
extends . Dessa kan även kallas barnklasser.
Man brukar säga att subklassen inkluderar superklassen. Det
innebär att metoder som tar till exempel cirklar som argument även
kan anropas med en cylinder eller ett klot. Cylindrar och klot är
ju också cirklar - i alla fall om man ser dem från rätt håll ;-)
Detta är möjligt eftersom en subklass alltid har alla egenskaper
som dess superklass har. Allt man kan göra med en cirkel kan man
också göra med en cylinder. (Detta kanske inte är sant rent
matematiskt, men vi ser det programmeringstekniskt här.)
Motsatsen är dock inte sann - en cirkel har inte alla egenskaper
som en cylinder har. Inklusionen är därför enkelriktad och man kan
inte skicka in cirklar till metoder som vill ha cylindrar.
Relaterade nyckelord: Klass, Överlagring.
Tillbaka till indexet |