Абстрактні класи та методи

Абстрактні класи являють собою виключно корисну концепцію обєктно-орієнтованого програмування З їх допомогою можна оголошувати класи, реалізовані лише частково, доручивши повну реалізацію розширеним класам

Абстракція виявляється корисною, коли деякий поведінка характерна для більшості або всіх обєктів даного класу, але деякі аспекти мають сенс лише для обмеженого кола обєктів, що не становлять суперкласу У Java такі класи оголошуються з ключовим словом abstract, і кожен метод, не реалізований в класі, також оголошується abstract (Якщо все, що вам потрібно, – це визначити набір методів, які будуть десь підтримуватися, але не надавати для них реалізації, то замість абстрактних класів, мабуть, краще скористатися інтерфейсами, описаними в розділі 4)

Припустимо, ви хочете створити інфраструктуру для написання коду, який буде під час виконання програми вимірювати певні показники Реалізація такого класу може враховувати, як відбувається вимір, але ви не знаєте заздалегідь, який саме показник вимірюватиметься Більшість абстрактних класів слід саме цим принципом: для конкретної роботи, виконуваної класом, необхідно, щоб хто-то надав відсутню частину У нашому прикладі таким відсутньою ланкою стає фрагмент програми, що виконує вимірювання Ось як може виглядати відповідний клас:

abstract class Benchmark {

abstract void benchmark()

public long repeat(int count) {

long start = SystemcurrentTimeMillis()

for (int i = 0 i &lt count i++)

benchmark()

return (SystemcurrentTimeMillis() — start)

}

}

Клас оголошений з ключовим словом abstract, тому що так оголошується будь-який клас, що містить абстрактні методи Подібна надмірність дозволяє під час читання програми швидко зрозуміти, чи є даний клас абстрактним, і обійтися без перегляду всіх методів і пошуку серед них абстрактних

Метод repeat надає загальну схему для проведення вимірювань Він знає, як йому викликати процедуру вимірювання count раз через рівні інтервали часу Якщо хронометраж повинен бути більш складним (наприклад, необхідно виміряти час кожного запуску і обчислити статистику відхилення від середнього значення), метод можна вдосконалити, що ніяк не відібється на реалізації процедури вимірювань в розширеному класі

Абстрактний метод benchmark повинен бути реалізований в кожному підкласі, який не є абстрактним Саме з цієї причини в класі відсутня реалізація, є лише оголошення Наведемо приклад найпростішого розширення класу Benchmark:

class MethodBenchmark extends Benchark {

void benchmark() {

}

public static void main(String[] args) {

int count = IntegerparseInt(args[0])

long time = new MethodBenchmark()repeat(count) Systemoutprintln(count + “ methods in ” +

time + “ milliseconds”)

}

}

Даний клас використовує benchmark для визначення часу, витраченого на виклик методу Тепер ви можете провести хронометраж, запустивши додаток MethodBenchmark, повідомивши йому кількість повторень тесту Значення передається в

програму у вигляді аргументу-рядки, з якого воно витягується методом parseInt класу

Integer, як описано в розділі Перетворення рядків.

Ви не можете створити обєкт абстрактного класу, оскільки для деяких викликаються методів може бути відсутнім реалізація

Будь клас може перевизначити методи свого суперкласу і оголосити їх абстрактними – конкретний метод в ієрархії типів стає абстрактним Це буває корисно, наприклад, коли прийнята за замовчуванням реалізація класу не підходить на деяких рівнях в його ієрархії

Вправа 36

Напишіть новий клас, який вимірює небудь інше – наприклад, час,

витрачений на виконання циклу від 0 до значення, переданого у вигляді параметра

Вправа 37

Змініть клас Vehicle так, щоб він містив посилання на обєкт EnergySource (джерело енергії), що асоціюється з Vehicle всередині конструктора Клас EnergySource повинен бути абстрактним, оскільки стан заповнення для обєкта GasTank (бензобак) має відзначатися інакше, ніж для обєкта Battery (акумулятор) Включіть в EnergySource

абстрактний метод empty і реалізуйте його в класах GasTank і Battery Включіть в

Vehicle метод start, який би перевіряв стан джерела енергії на початку поїздки

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*