Назад Вперед Зміст

Відношення між класами у C#

У об'єктно-орієнтованому програмуванні відношення між класами описують, як об’єкти взаємодіють один з одним. Найпоширеніші типи: асоціація, агрегація та композиція.


1. Асоціація (Association)

Асоціація — це загальне відношення, коли один клас використовує інший, але не володіє ним. Обидва об’єкти можуть існувати незалежно.


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); // Асоціація: водій використовує машину
    }
}

2. Агрегація (Aggregation)

Агрегація — це слабка форма відношення "ціле-частина". Один об’єкт містить інший, але обидва можуть існувати незалежно.


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))}");
    }
}

3. Композиція (Composition)

Композиція — це сильне відношення "ціле-частина", коли життєвий цикл частин повністю залежить від цілого. Якщо об’єкт-власник знищується, знищуються і його частини.


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, кімнати теж зникнуть
    }
}

Висновок

Типи зв'язків між об'єктами в ООП

Тип зв'язку Характер зв'язку Об'єкт може існувати незалежно? Видалення власника видаляє об'єкт?
Асоціація Використання ✔ Так ✗ Ні
Агрегація Включення ✔ Так ✗ Ні
Композиція Володіння ✗ Ні ✔ Так

Пояснення:

Задача 1: Композиция — "Книга и Глава” Условие: Создайте классы Book и Chapter. Каждая книга обязательно содержит одну или несколько глав. Главы создаются внутри книги (внутри конструктора или метода AddChapter()). Что проверить: Глава не существует без книгиПри удалении книги, главы теряют смысл существования
Задача 2: Агрегация — "Школа и Ученики« Условие: Создайте классы Student и School. Школа содержит список учеников, но ученики могут существовать вне школы и переходить между школами. Что проверить: Школа содержит список ListУченик может существовать независимо и быть добавлен в другую школу
Задача 3: Композиция — "Компьютер и Процессор” Условие: Создайте класс Computer, который внутри себя создаёт объект Processor. Процессор — это часть компьютера, создаётся в конструкторе и недоступен снаружи. Что проверить: Объект Processor создаётся внутри ComputerБез Computer процессор не может использоваться
Задача 4: Агрегация — "Команда и Игроки” Условие: Создайте классы Team и Player. Игрок может быть в одной команде, но также может существовать и без команды. Команда может быть создана, а потом к ней присоединяются игроки. Что проверить: Player создаётся отдельноTeam агрегирует список игроковОдин игрок может быть удалён из команды и перейти в другую

Назад Вперед Зміст