Приклад інтерфейсу

У попередньому розділі ми представили читачеві клас Attr і показали, як розширити його для створення спеціалізованих типів обєктів з атрибутами Тепер все, що нам потрібно, – навчитися повязувати атрибути з обєктами Для цього служать два підходи: композиція і спадкування Ви можете створити в обєкті набір певних атрибутів і надати програмісту доступ до цього набору Другий метод полягає в тому, що ви розглядаєте атрибути обєкта як складову частину його типу і включаєте їх в ієрархію класу Обидва підходи цілком припустимі ми вважаємо, що зберігання атрибутів

в ієрархії класу приносить більше користі Ми створимо тип Attributed, який може використовуватися для наділення обєктів атрибутами допомогою закріплення за ними обєктів Attr

Однак в Java підтримується тільки одиночне спадкоємство (single inheritance) при реалізації – це означає, що новий клас може бути безпосереднім розширенням всього одного класу Якщо ви створюєте клас Attributed, від якого породжуються інші класи, то вам або доведеться закладати Attributed в основу всієї ієрархії, або програмісти опиняться перед вибором: чи розширювати їм клас Attributed або який-небудь інший корисний клас

Кожен раз, коли ви створюєте корисний засіб начебто Attributed, виникає бажання включити його в кореневий клас Object Якби це дозволялося, то клас Object незабаром розрісся б настільки, що працювати з ним стало б неможливо

У Java допускається множинне спадкування інтерфейсів, так що замість того, щоб включати можливості класу Attributed в Object, ми оформимо його у вигляді інтерфейсу Наприклад, щоб наділити атрибутами наш клас небесних тіл, можна оголосити його таким чином:

class AttributedBody extends Body implements Attributed

Зрозуміло, для цього нам знадобиться інтерфейс Attributed:

interface Attributed {

void add(Attr newAttr)

Attr find(String attrName) Attr remove(String attrName) javautilEnumeration attrs()

}

У даному інтерфейсі оголошуються чотири методи Перший з них додає новий атрибут в обєкт Attributed другий перевіряє, чи включався раніше в обєкт атрибут з вказаним імям третій видаляє атрибут з обєкта четвертий повертає список атрибутів, закріплених за обєктом В останньому з них використовується інтерфейс Enumeration, визначений для класів-колекцій Java javautilenumeration детально розглядається в розділі 12

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

Методи інтерфейсу завжди є відкритими Вони не можуть бути статичними, оскільки статичні методи завжди ставляться до конкретного класу і ніколи не бувають абстрактними, а інтерфейс може включати тільки абстрактні метод.

З іншого боку, поля інтерфейсу завжди оголошуються static і final Вони являють собою константи, що використовуються при виклику методів Наприклад, інтерфейс, в контракті якого передбачено кілька рівнів точності, може виглядати наступним чином:

interface Verbose { int SILENT  = 0 int TERSE   = 1 int NORMAL  = 2 int VERBOSE = 3

void setVerbosity(int level)

int getVerbosity()

}

Константи SILENT, TERSE, NORMAL і VERBOSE передаються методу set Verbosity таким чином можна присвоїти імена постійним величинам, які мають конкретне значення Вони повинні бути константами, а всі поля інтерфейсу неявно оголошуються static і final

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

*

*