Abstrakta klasser

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

Abstrakta klasser

En abstrakt klass är en klass som du inte avser att skapa instanser av. I Java kan man deklarera klasser som abstract för att garantera att ingen skapar instanser av klassen av misstag.

Exempel:

Anta att vi skriver ett litet ritprogram. Vi vill definiera klasser för olika geometriska figurer, till exempel cirklar, kvadrater, trianglar.

Alla klasser ska definiera en metod draw().

För att kunna hantera alla figurer likformigt definierar vi en abstrakt klass GeometricShape och låter alla klasser som representerar en figur ärva från denna.

Abstrakt klass: exempel

abstract public class GeometricShape {
  public GeometricShape( int ix, int iy ) { ... }

  protected int x;
  protected int y;

  abstract public void draw( Graphics g);
  public void move( int dx, int dy )  { ... }
}

class Square extends GeometricShape {
   public void draw ( Graphics g ) { ... }}

class Rectangle extends GeometricShape {
   public void draw ( Graphics g ) { ... }}

Abstrakta klasser, regler:

En abstrakt klass är som en vanlig klass; du kan alltså ha variabler som deklarerats med en abstract klass (till exempel GeometricShape) men

Abstrakta klasser är ganska vanliga i OOP. I fordonsexemplet är det lämpligt att deklarera Motorfordon och Fordon som abstrakta eftersom varje fordon tillhör någon av subklasserna till dessa klasser.

Tips

Om du skriver ett program där en klass överskuggar en metod som redan definierats i en superklass (se tidigare avsnitt) kan det vara idé att fråga sig om klasstrukturen är rätt. Kanske borde nuvarande klass och superklassen vara subklasser till en abstrakt klass.

Fråga:

Hur använder man en variabel som deklarerats så här:

GeometricShape s;

Innan du går vidare

I del 4 beskriver jag ett begrepp som är snarlikt abstrakta klasser. Det kan vara idé att lägga tid på att försäkra dig om att du förstår begreppet abstrakta klasser innan du går vidare i anteckningarna, annars finns det en risk att begreppen flyter ihop.

Prova att skriva (och provköra) ett litet program som använder abstrakta klasser. Du kan utgå från fordonsexemplet om du vill.