Middle
Kdy byste měli použít rozhraní a kdy abstrétní třídu?
sobes.tech AI
Odpověď od AI
Používáme abstraktní třídu k vytvoření základní funkčnosti a obecného stavu, který mohou dědit podtřídy. Je vhodná, když existují společné metody s implementací a metody, které je třeba přepsat. Abstraktní třída může mít pole a konstruktory.
// Abstraktní třída
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound(); // Abstraktní metoda
void eat() { // Metoda s implementací
System.out.println(name + " jí.");
}
}
Používáme rozhraní k definování smlouvy, která popisuje sadu metod, jež musí být implementovány třídami. Je vhodné pro dosažení vícenásobného chování (vícenásobného dědičnosti funkcionality). Rozhraní nemůže mít stav (instance pole, kromě konstant) ani konstruktory (před Java 8).
// Rozhraní
interface Flyable {
void fly(); // Abstraktní metoda
}
Tabulka srovnání rozdílů:
| Vlastnost | Abstraktní třída | Rozhraní |
|---|---|---|
| Typ členů | Pole, abstraktní a konkrétní metody, konstruktory | Konstanty, abstraktní metody (výchozí), statické a default metody (od Java 8) |
| Implementace metod | Může mít metody s implementací | Pouze abstraktní metody do Java 8, od Java 8 - static a default |
| Stav | Může mít stav (pole) | Nemůže mít stav (instance pole) |
| Dědičnost | Jednoduchá dědičnost | Vícenásobná implementace |
| Použití | "je-a" (is-a) - základní typ | "má-a" (has-a) - smlouva o chování |