"Bună, Amigo! Avem un subiect nou fascinant."

„Astăzi este doar o zi cu subiecte fascinante!”

"De ce vă mulțumesc!"

"Cu plăcere."

„Îți amintești când am introdus clasa de bază ChessItem pentru a simplifica toate clasele pentru piesele de șah?”

"Da."

"Acum imaginați-vă că fiecare piesă are o metodă care se ocupă de redarea piesei pe ecran. Apelați metoda și piesa se desenează la coordonatele sale curente. Ar fi util să mutați această metodă în clasa de bază?"

"Da." După ce am învățat despre polimorfism, aș putea apela metoda de randare pentru toate piesele, indiferent de tipul lor. Ceva de genul:"

De exemplu:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  ArrayList <ChessItem> items = new ArrayList<ChessItem>();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  //draw them regardless of their type.
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

"Bravo. Exact. Și ce s-ar face prin metoda draw a clasei ChessItem în sine?"

"Nu știu. Șahul nu are o astfel de piesă. Și asta înseamnă că nu are nicio reprezentare vizuală."

„Mai exact. Și nu are sens să creezi un obiect ChessItem. Nu există o astfel de piesă de șah. Este doar o abstracție — o clasă pe care am făcut-o pentru comoditate. Așa funcționează abstracția în POO: am mutat toate elementele importante (partajate). de toate piesele) date și metode într-o clasă de bază , dar am păstrat diferențele lor în clasele corespunzătoare unor piese de șah specifice."

Java are un tip de clasă special pentru aceasta: clasa abstractă . Iată trei lucruri de reținut despre orele abstracte.

1) O clasă abstractă poate declara metode fără a le implementa. O astfel de metodă se numește metodă abstractă.

De exemplu:
 public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) O metodă abstractă este marcată cu cuvântul cheie abstract .

Dacă o clasă are chiar și o singură metodă abstractă, atunci clasa este de asemenea marcată cu abstract .

3) Nu puteți crea obiecte dintr-o clasă abstractă. Codul care încearcă să facă acest lucru pur și simplu nu se va compila.

Cod Java Descriere
ChessItem item = new ChessItem();
item.draw();
Acest cod nu se va compila.
ChessItem item = new Queen();
item.draw();
Dar poți face asta.

4) Dacă clasa dumneavoastră moștenește o clasă abstractă, trebuie să suprascrieți toate metodele abstracte moștenite, adică trebuie să le implementați. În caz contrar, clasa dumneavoastră va trebui, de asemenea, declarată abstractă. Dacă clasa are chiar și o singură metodă neimplementată declarată direct în clasă sau moștenită de la clasa părinte, atunci clasa este considerată abstractă.

"Dar de ce sunt necesare toate acestea? De ce avem nevoie de clase abstracte? Nu este posibil să folosim în schimb clase obișnuite? Și în loc de metode abstracte, nu putem să creăm implementări goale care constau în deschiderea și închiderea parantezelor?"

"Ați putea. Dar aceste restricții sunt ca privatemodificatorul. Folosim privatemodificatorul pentru a bloca în mod deliberat accesul direct la date, astfel încât alți programatori și clasele lor să folosească publicmetodele noastre."

Același lucru este valabil și pentru o clasă abstractă. Cine a scris clasa nu vrea ca nimeni să creeze instanțe ale clasei. Dimpotrivă, autorul se așteaptă ca metodele abstracte ale clasei sale abstracte să fie moștenite și depășite.

„Încă nu înțeleg de ce am vrea să ne complicăm viața în acest fel”.

"Avantajul acestei caracteristici este evident în proiectele mari. Cu cât ai mai multe clase, cu atât mai clar trebuie să le delimitezi rolurile. Vei vedea avantajul de a face asta și în curând. Toată lumea trebuie să treacă prin asta."