Abstraktní třídy

  • I když Java disponuje rozhraními, někdy je vhodné určitou specifikaci implementovat pouze částečně:

    Rozhraní

    Specifikace

    Abstraktní třída

    Částečná implementace, typicky předek konkrétních tříd, plných implementací

    (Neabstraktní) třída

    (Úplná) implementace

Zápis abstraktní třídy

  • Abstraktní třída je označena klíčovým slovem abstract v hlavičce, např.:

    public abstract class AbstractSearcher
  • Název začínající na Abstract není povinný ani nutný.

  • Obvykle má alespoň jednu abstraktní metodu, deklarovanou např.:

    public abstract int indexOf(double d);
  • Od abstraktní třídy nelze vytvořit instanci, nelze napsat např.:

    Searcher ch = new AbstractSearcher(...);

Reálný příklad rozhraní → abstraktní třída → neabstraktní třída

  • Viz demo searching pro BlueJ:

    Searcher

    rozhraní - specifikuje, co má prohledávač umět

    AbstractSearcher

    abstraktní třída - předek konkrétních plných implementací prohledávače

    LinearSearcher

    konkrétní třída - plná implementace prohledávače

Searcher

Rozhraní

specifikuje, co má prohledávač umět

public interface Searcher {
   // Nastav do vyhledávače pole, kde se bude vyhledávat
   void setData(double[] a);
   // Zjisti, zda pole obsahuje číslo d
   boolean contains(double d);
   // Zjisti pozici, na níž je v poli číslo d.
   // Není-li tam, vrať -1
   int indexOf(double d);
}

AbstractSearcher

Abstraktní třída

předek konkrétních plných implementací prohledávače

public abstract class AbstractSearcher implements Searcher {
   // třída rozhraní implementuje, ale ne úplně
   // úložiště prvků JE implementováno
   private double[] array;
   // nastavení úložiště prvků JE implementováno
   public void setData(double[] a) { array = a; }
   public double[] getData() { return array; }
   // rozhodnutí, zda prvek je přítomen na základě vyhledání jeho pozice
   // též může být již implementováno!
   public boolean contains(double d) {
      return indexOf(d) >= 0;
   }
   // samotné vyhledání prvku není implementováno
   public abstract int indexOf(double d);
}

LinearSearcher

Konkrétní třída

plná implementace prohledávače — tentokrát pomocí lineárního prohledání

public class LinearSearcher extends AbstractSearcher {
   // doimplementuje se, co zbývá a to je metoda indexOf!
   public int indexOf(double d) {
      double[] data = getData();
      for(int i = 0; i < data.length; i++) {
         if(data[i] == d) {
            return i;
         }
      }
      return -1;
   }
}