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; } }