"Здравей, Амиго! Имаме завладяваща нова тема."
„Днес е просто ден на увлекателни теми!“
"Защо, благодаря!"
"Моля."
„Помните ли, когато въведохме базовия клас 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 | Описание |
---|---|
|
Този code няма да се компorра. |
|
Но можете да направите това. |
4) Ако вашият клас наследи абстрактен клас, трябва да замените всички наследени абстрактни методи, т.е. трябва да ги имплементирате. В противен случай вашият клас също ще трябва да бъде обявен за абстрактен. Ако класът има дори един неимплементиран метод, деклариран директно в класа or наследен от родителския клас, тогава класът се счита за абстрактен.
"Но защо е необходимо всичко това? Защо имаме нужда от абстрактни класове? Не е ли възможно да използваме обикновени класове instead of това? И instead of абстрактни методи, не можем ли просто да създадем празни реализации, състоящи се от отварящи и затварящи фигурни скоби?"
„Можете. Но тези ограничения са като private
модификатора. Ние използваме private
модификатора, за да блокираме умишлено директния достъп до данни, така че други програмисти и техните класове да използват нашите public
методи.“
Същото важи и за абстрактен клас. Който и да е написал класа, не иска никой да създава екземпляри на класа. Напротив, авторът очаква абстрактните методи на неговия or нейния абстрактен клас да бъдат наследени и заменени.
„Все още не разбирам защо искаме да усложняваме живота си по този начин.
"Предимството на тази функция е очевидно в големи проекти. Колкото повече класове имате, толкова по-ясно трябва да очертаете техните роли. Ще видите предимството да правите това, и то скоро. Всеки трябва да премине през това."
GO TO FULL VERSION