Middle
Kada naudoti sąsają, o kada abstrakčią klasę?
sobes.tech AI
Atsakymas iš AI
Naudojame abstraktų klasę, kad sukurtume bazinę funkcionalumą ir bendrą būseną, kurią gali paveldėti pogrupiai. Ji tinka, kai yra bendri metodai su įgyvendinimu ir metodai, kurie turi būti perrašyti. Abstrakti klasė gali turėti laukus ir konstruktorius.
// Abstrakti klasė
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound(); // Abstraktus metodas
void eat() { // Metodas su įgyvendinimu
System.out.println(name + " valgo.");
}
}
Naudojame sąsają, kad apibrėžtume sutartį, aprašantį metodų rinkinį, kurį turi įgyvendinti klasės. Ji tinka daugybinio elgesio (daugybinio paveldėjimo funkcionalumo) pasiekimui. Sąsaja negali turėti būsenos (kintamųjų laukų, išskyrus konstantas) ir konstruktorių (iki Java 8).
// Sąsaja
interface Flyable {
void fly(); // Abstraktus metodas
}
Palyginimo lentelė:
| Savybė | Abstrakti klasė | Sąsaja |
|---|---|---|
| Narių tipas | Laukai, abstraktūs ir konkretūs metodai, konstruktoriai | Konstantos, abstraktūs metodai (numatyti), statiniai ir default metodai (nuo Java 8) |
| Metodų įgyvendinimas | Gali turėti įgyvendintus metodus | Tik abstraktūs metodai iki Java 8, nuo Java 8 - static ir default |
| Būsenos | Gali turėti būseną (laukus) | Negali turėti būsenos (kintamųjų laukų) |
| Paveldėjimas | Viengubas paveldėjimas | Daugialypis įgyvendinimas |
| Naudojimas | "yra" (is-a) - bazinis tipas | "turi" (has-a) - elgesio sutartis |