У об'єктно-орієнтованому програмуванні відношення між класами описують, як об’єкти взаємодіють один з одним. Найпоширеніші типи: асоціація, агрегація та композиція.
Асоціація — це загальне відношення, коли один клас використовує інший, але не володіє ним. Обидва об’єкти можуть існувати незалежно.
using System;
class Driver
{
public string Name { get; }
public Driver(string name) => Name = name;
public void Drive(Car car)
{
Console.WriteLine($"{Name} керує автомобілем {car.Model}");
}
}
class Car
{
public string Model { get; }
public Car(string model) => Model = model;
}
class Program
{
static void Main()
{
Driver d = new Driver("Олег");
Car c = new Car("Toyota");
d.Drive(c); // Асоціація: водій використовує машину
}
}
Агрегація — це слабка форма відношення "ціле-частина". Один об’єкт містить інший, але обидва можуть існувати незалежно.
using System;
using System.Collections.Generic;
class Team
{
public string Name { get; }
public List Players { get; } = new List();
public Team(string name) => Name = name;
public void AddPlayer(Player player)
{
Players.Add(player);
}
}
class Player
{
public string Name { get; }
public Player(string name) => Name = name;
}
class Program
{
static void Main()
{
Player p1 = new Player("Іван");
Player p2 = new Player("Петро");
Team team = new Team("Чемпіони");
team.AddPlayer(p1);
team.AddPlayer(p2);
Console.WriteLine($"{team.Name} має гравців: {string.Join(", ", team.Players.ConvertAll(p => p.Name))}");
}
}
Композиція — це сильне відношення "ціле-частина", коли життєвий цикл частин повністю залежить від цілого. Якщо об’єкт-власник знищується, знищуються і його частини.
using System;
using System.Collections.Generic;
class House
{
public List Rooms { get; } = new List();
public House(int roomCount)
{
for (int i = 1; i <= roomCount; i++)
{
Rooms.Add(new Room($"Кімната {i}"));
}
}
}
class Room
{
public string Name { get; }
public Room(string name) => Name = name;
}
class Program
{
static void Main()
{
House house = new House(3);
foreach (var room in house.Rooms)
{
Console.WriteLine(room.Name);
}
// Після знищення house, кімнати теж зникнуть
}
}
| Тип зв'язку | Характер зв'язку | Об'єкт може існувати незалежно? | Видалення власника видаляє об'єкт? |
|---|---|---|---|
| Асоціація | Використання | ✔ Так | ✗ Ні |
| Агрегація | Включення | ✔ Так | ✗ Ні |
| Композиція | Володіння | ✗ Ні | ✔ Так |
Композиция — "Книга и Глава”
Условие:
Создайте классы Book и Chapter. Каждая книга обязательно содержит одну или несколько глав. Главы создаются внутри книги (внутри конструктора или метода AddChapter()).
Что проверить: Глава не существует без книгиПри удалении книги, главы теряют смысл существования
Агрегация — "Школа и Ученики«
Условие: Создайте классы Student и School. Школа содержит список учеников, но ученики могут существовать вне школы и переходить между школами.
Что проверить: Школа содержит список ListКомпозиция — "Компьютер и Процессор”
Условие:
Создайте класс Computer, который внутри себя создаёт объект Processor. Процессор — это часть компьютера, создаётся в конструкторе и недоступен снаружи.
Что проверить: Объект Processor создаётся внутри ComputerБез Computer процессор не может использоваться
Агрегация — "Команда и Игроки”
Условие:
Создайте классы Team и Player. Игрок может быть в одной команде, но также может существовать и без команды. Команда может быть создана, а потом к ней присоединяются игроки.
Что проверить: Player создаётся отдельноTeam агрегирует список игроковОдин игрок может быть удалён из команды и перейти в другую