Розширений клас

Кожен клас з тих, що зустрічалися нам в цій книзі, є розширеним, незалежно від того, чи оголошений він з ключовим словом extends чи ні Навіть такі класи, як Body, які начебто не розширюють інших класів, насправді неявно відбуваються від належить Java класу Object Іншими словами, Object знаходиться в корені всієї ієрархії класів У ньому оголошуються методи, які реалізовані під всіх обєктах Змінні типу Object можуть посилатися на будь-які обєкти, будь це екземпляри класу або масиви

Наприклад, при розробці класу для списку, елементи якого можуть бути обєктами довільного типу, можна передбачити в ньому поле типу Object У такий список не можуть входити значення примітивних типів (Int, boolean і т д), однак при

необхідності можна створити обєкти цих типів за допомогою класів-оболонок (Integer, Boolean і т д), описаних у главі 13

Для демонстрації роботи з підкласами почнемо з базового класу для зберігання атрибутів, представлених у вигляді пар імя / значення Імена атрибутів є рядками (наприклад, колір або розташування) Атрибути можуть мати довільний тип, тому їх значення зберігаються в змінних типу Object:

class Attr {

private String name

private Object value = null

public Attr(String nameOf) {

name = nameOf

}

public Attr(String nameOf, Object valueOf) {

name = nameOf

value = valueOf

}

public String nameOf() {

return name

}

public Object valueOf() {

return value

}

public Object valueOf(Object newValue) { Object oldVal = value

value = newValue

return oldVal

}

}

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

Наступний клас розширює поняття атрибута для зберігання колірних атрибутів, які можуть бути рядками, службовцями для іменування або опису кольорів Описи квітів можуть являти собою як назви (Червоний або бежевий), за якими необхідно знайти потрібне значення в таблиці, так і числові значення, які можуть перетворюватися в стандартне, більш ефективне представлення ScreenColor (яке, як передбачається, визначено в іншому місці програми) Перетворення опису в обєкт ScreenColor повязане з великими накладними витратами, так що для кожного атрибута цю операцію бажано виконувати тільки один раз Для цього ми розширюємо клас Attr і створюємо на його основі клас ColorAttr, що включає спеціальний метод для отримання перетвореного обєкта ScreenColor Даний метод реалізований так, що перетворення виконується всього один раз:

class ColorAttr extends Attr {

private ScreenColor myColor / / Перетворений колір

public ColorAttr(String name, Object value) {

super(name, value)

decodeColor()

}

public ColorAttr(String name) {

this(name, “transparent”)

}

public ColorAttr(String name, ScreenColor value) {

super(name, valuetoString())

myColor = value

}

public Object valueOf(Object newValue) {

/ / Спочатку виконати метод valueOf () суперкласу Object retval = supervalueOf (newValue) decodeColor ()

return retval

}

/ ** Присвоїти атрибуту ScreenColor значення,

а не опис * /

public ScreenColor valueOf(ScreenColor newValue) {

/ / Спочатку виконати метод valueOf () суперкласу

supervalueOf(newValuetoString())

myColor = newValue

return newValue

}

/ ** Повернути перетворений обєкт ScreenColor * /

public ScreenColor color() {

return myColor

}

/ ** Задати ScreenColor за описом в valueOf * /

protected void decodeColor() { if (valueOf() == null) myColor = null

else

}

}

myColor = new ScreenColor(valueOf())

Спочатку ми створюємо новий клас ColorAttr, що розширює клас Attr Основні функції класу ColorAttr ті ж, що і у класу Attr, але до них додається кілька нових Клас Attr є суперкласом по відношенню до ColorAttr, а ColorAttr – подклассом стосовно Attr Ієрархія класів для нашого прикладу виглядає наступним чином (суперклас на діаграмі розташований вище свого підкласу):

ColorAttr виконує три основні функції:

Він забезпечує наявність трьох конструкторів: два з них копіюють поведінку суперкласу, а третій дозволяє відразу передати обєкт Screen Color

Він перевантажує і перевизначає метод valueOf базового класу, щоб при зміні значення атрибута створився обєкт ScreenColor

Він включає новий метод color для повернення колірного опису,

перетвореного в обєкт ScreenColor

Вправа 31

На основі класу Vehicle з глави 2 створіть розширений клас з імям PassengerVehicle і наділіть його можливістю визначення числа вільних і зайнятих місць в машині Включіть в PassengerVehicle новий метод main, який створює кілька обєктів і виводить їх

Джерело: Арнольд К, Гослінг Д – Мова програмування 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>

*

*