English

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.