
1.3. Типи відношень між класами
Будь-яка програма, написана об’єкто-зорієнтованою мовою, це набір взаємно пов’язаних між собою класів. Ці класи повинні знати один про одного, щоб взаємодіяти між собою і разом виконати поставлену задачу.
Наведемо найпростіші і найчастіше використовувані зв’язки між класами в рамках об’єктної моделі:
Агрегація (Aggregation)
Асоціація (Association)
Успадкування (Inheritance)
Метакласи (Metaclass)
1.3.1 Агрегація
Відношення між класами типу “містить” або “складається з” називається агрегацією або включенням. Наприклад, якщо акваріум наповнений водою і в ньому плавають рибки, то можна сказати, що акваріум агрегує в собі воду і рибок.
Таке відношення включення або агрегації (aggregation) зображується лінією з ромбикомна боці того класу, який є власником або контейнером. Необов’язкова назва відношення записується посередині лінії.
В прикладі відношення “contain” – двонаправлене. Об’єкт класу Aquarium`’ містить кілька об’єктів класуFish. Кожна рибка “знає”, в якому саме акваріумі вона живе. Факт участі класу у відношенні зображується за допомогою ролі. В прикладі бачимо роль “home” класуAquarium (акваріум – дім для рибок), а також роль ”inhabitants” класуFish(рибки – жильці акваріума). Назва ролі збігається з назвою відповідного поля в класі. Зображення такого поля на діаграмі лишнє, якщо вже зображено ім’я ролі. Тобто в даному випадку класAquarium буде мати властивість (поле)inhabitants, а класFish – властивість home.
Кількість об’єктів, які беруть участь у відношенні, записується поряд з іменем ролі. Запис ”0..n” означає ”від нуля до безмежності”. Прийняті також позначення
“1..n” – від одиниці до безмежності;
“0” – нуль;
“1” – один;
“n” – фіксована кількість;
“0..1” – нуль або один.
Код,який описує розглянуту модель і явище агрегації може виглядати, наприклад, так:
// визначення класуFish
public class Fish {
// визначення поля home (посилання на об’єктAquarium)
private Aquarium home;
public Fish() {
}
}
// визначення класуAquarium
public class Aquarium {
// визначення поля inhabitants(масив посилань на об’єктиFish)
private Fish inhabitants [];
public Aquarium () {
}
}
1.3.2. Асоціація
Якщо об’єкти одного класу посилаються на один або більше об’єктів другого класу, але ні в той, ні в другий бік відношення між об’єктами не має характеру “володіння” або конвеєризації, то таке відношення називають асоціацією (association). Відношення асоціації зображується так же, як і відношення агрегації, але лінія, яка пов’язує класи – проста, без ромбика
Як приклад розглянемо програміста і його комп’ютер. Між цими об’єктами нема агрегації. Так, завжди можна встановити за якими комп’ютерами працює який-небудь програміст, а також які люди користуються окремо взятим комп’ютером. В розглянутому прикладі є асоціація багато-до-багатьох.
У даному випадку між екземплярами класів Programmer і Computer в обидва боки використовується відношення ”0..n”, оскільки програміст теоретично може не користуватися комп’ютером (якщо він теоретик або на пенсії). У свою чергу комп’ютер може ніким не використовуватися (якщо він новий і ще не установлений).
Код, який відповідає розглянутому прикладу, буде, наприклад, такий:
public class Programmer{
privateComputer computers [];
public Programmer() {
}
}
public class Computer {
private Programmer programmers [];
public Computer () {
}
}