arv.xml

Denna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.


<?xml version="1.0"?>
<article category="software" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="article.xsd">
  <keyword>Arv</keyword>
  <keyword>Superklass</keyword>
  <keyword>Subklass</keyword>
  <topic>Arv</topic>
  <ingress>
    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.
  </ingress>

  <text>
    Följande Java-exempel visar hur arv kan användas. Vi ser två
    klasser där klassen <code>Cylinder</code> ärver klassen
    <code>Cirkel</code>.
  </text>

  <codebox>
    class Cirkel
    {
       int radie;

       int area()
       {
          return radie * radie * Math.PI;
       }
    }
  </codebox>

  <codebox>
    class Cylinder extends Cirkel
    {
       int höjd;

       int volym()
       {
          return area() * höjd;
       }
    }
  </codebox>

  <text>
    Nyckelordet <code>extends</code> är Javas sätt att uttrycka arv.
    Objekt av typen Cirkel har en instansvariabel, <code>radie</code>
    och en metod, <code>area</code>.  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.
  </text>

  <text>
    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, <code>Klot</code> som ju också är en
    utökning av en cirkel.
  </text>

  <codebox>
    class Klot extends Cirkel
    {
       int volym()
       {
          return (radie * radie * radie * Math.PI) / 3;
       }
    }
  </codebox>

  <text>
    Vi ser att vi kan använda variabeln <code>radie</code> och metoden
    <code>area</code> i både <code>Cylinder</code> och
    <code>Klot</code>.  Klasserna <code>Cylinder</code> och
    <code>Klot</code> har dock ingen koppling till varandra. Vi kan
    inte komma åt variabeln <code>höjd</code> i ett klot - för den
    finns helt enkelt inte där.
  </text>

  <subtopic>Superklass och subklass</subtopic>
  <text>
    Cirkeln i exemplet ovan brukar kallas för <em>superklass</em> eller
    föräldraklass. Det är alltså den klass som andra klasser ärver.
    Cylindern och klotet kallas <em>subklasser</em>. Subklassen är den
    klass som ärver - det är i subklassen vi hittar ordet
    <code>extends</code>. Dessa kan även kallas barnklasser.
  </text>

  <text>
    Man brukar säga att subklassen <em>inkluderar</em> 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.
  </text>

  <text>
    Relaterade nyckelord: Klass, Överlagring.
  </text>
</article>