"Здравей, Амиго! Имаме завладяваща нова тема."

„Днес е просто ден на увлекателни теми!“

"Защо, благодаря!"

"Моля."

„Помните ли, когато въведохме базовия клас ChessItem, за да опростим всички класове за шахматни фигури?“

— Да.

„Сега си представете, че всяка част има метод, който се справя с изобразяването на частта на екрана. Извиквате метода и частта се рисува в текущите си координати. Ще бъде ли полезно да преместите този метод в базовия клас?“

— Да. След като научих за полиморфизма, ще мога да извикам метода за изобразяване за всички части, независимо от техния тип. Нещо като това:"

Например:
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();
  }
 }
}

„Браво. Точно така. И Howво би направил методът draw на самия клас ChessItem?“

„Не знам. Шахът няма такава фигура. А това означава, че няма визуално представяне.“

„Точно така. И няма смисъл да се създава обект ChessItem. Няма такава шахматна фигура. Това е само абстракция — клас, който направихме за удобство. Ето How работи абстракцията в ООП: преместихме всички важни (споделени от всички фигури) данни и методи в базов клас , но запазихме разликите им в класовете, съответстващи на конкретни шахматни фигури."

Java има специален тип клас за това: абстрактен клас . Ето три неща, които трябва да запомните за абстрактните класове.

1) Абстрактен клас може да декларира методи, без да ги имплементира. Такъв метод се нарича абстрактен метод.

Например:
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) Абстрактен метод се маркира с ключовата дума abstract .

Ако даден клас има дори един абстрактен метод, тогава класът също се маркира с abstract .

3) Не можете да създавате обекти от абстрактен клас. Кодът, който се опитва да направи това, просто няма да се компorра.

Java code Описание
ChessItem item = new ChessItem();
item.draw();
Този code няма да се компorра.
ChessItem item = new Queen();
item.draw();
Но можете да направите това.

4) Ако вашият клас наследи абстрактен клас, трябва да замените всички наследени абстрактни методи, т.е. трябва да ги имплементирате. В противен случай вашият клас също ще трябва да бъде обявен за абстрактен. Ако класът има дори един неимплементиран метод, деклариран директно в класа or наследен от родителския клас, тогава класът се счита за абстрактен.

"Но защо е необходимо всичко това? Защо имаме нужда от абстрактни класове? Не е ли възможно да използваме обикновени класове instead of това? И instead of абстрактни методи, не можем ли просто да създадем празни реализации, състоящи се от отварящи и затварящи фигурни скоби?"

„Можете. Но тези ограничения са като privateмодификатора. Ние използваме privateмодификатора, за да блокираме умишлено директния достъп до данни, така че други програмисти и техните класове да използват нашите publicметоди.“

Същото важи и за абстрактен клас. Който и да е написал класа, не иска никой да създава екземпляри на класа. Напротив, авторът очаква абстрактните методи на неговия or нейния абстрактен клас да бъдат наследени и заменени.

„Все още не разбирам защо искаме да усложняваме живота си по този начин.

"Предимството на тази функция е очевидно в големи проекти. Колкото повече класове имате, толкова по-ясно трябва да очертаете техните роли. Ще видите предимството да правите това, и то скоро. Всеки трябва да премине през това."