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

Об'єктно-орієнтоване програмування (OOP) побудоване навколо того, як класи та об'єкти взаємодіють між собою. У цьому блозі ми детальніше розглянемо чотири основні стосунки OOP: Асоціація, Агрегація, Композиція та Узагальнення. Ми пояснимо теоретичні концепції цих стосунків, надамо практичні приклади та покажемо, як ефективно використовувати їх у вашому коді. Наприкінці статті ви матимете чітке розуміння цих важливих концепцій і зможете застосовувати їх для проектування кращих систем.

Асоціація

Визначення: Асоціація представляє собою стосунки між двома класами, де один клас використовує або взаємодіє з іншим, але не володіє ним.

Сценарій: Вчитель може навчати багатьох студентів, а студент може навчатися у кількох вчителів.

class Student:  
 def __init__(self, name, age):  
 self.name = name  
 self.age = age  

 def _get_student_data(self):  
 print(f"{self.name} is {self.age} years old.")  

class Teacher:  
 def __init__(self, name, subject, students):  
 self.name = name  
 self.subject = subject  
 self.students = students  

 def _get_teacher_details(self):  
 print(f"{self.name} is teaching {self.subject}")  

 def _teaching_students(self):  
 students_list = [student.name for student in self.students]  
 print(f"{self.name} is teaching all {students_list}")  

if __name__ == "__main__":  

 student1 = Student("Varsha", 12)  
 student2 = Student("Shivansh", 17)  

 student1._get_student_data()  
 student2._get_student_data()  

 teacher = Teacher("Radhika", "Maths", [student1, student2])  
 teacher._get_teacher_details()  
 teacher._teaching_students()

вивід:

Varsha is 12 years old.
Shivansh is 17 years old.
Radhika is teaching Maths
Radhika is teaching all [‘Varsha’, ‘Shivansh’]

Пояснення асоціації:

  • Відносини між студентом і вчителем (Асоціація):
  • Вчитель має список студентів: Клас Teacher має список students, що означає, що кожен об'єкт Teacher знає про об'єкти Student, з якими він пов'язаний (тобто вчитель навчає студентів).
  • Взаємодія між студентом і вчителем: Об'єкт Student не "володіє" об'єктом Teacher, і об'єкт Teacher не "володіє" об'єктом Student. Натомість вони взаємодіють — вчителі навчають студентів, а студенти вчаться у вчителів.
    Відносини між класами в основному є взаємодією, а не власністю.

Агрегація

Визначення: Агрегація — це особливий тип асоціації, де один клас містить інший як частину, але ця частина може існувати незалежно від цілого.

class Wheel:  
 def __init__(self, company):  
 self.company = company  

 def get_wheel_details(self):  
 return f"This wheel is being manufactured by {self.company}."  


class Car:  
 def __init__(self, model, wheels):  
 self.model = model  
 self.wheels = wheels  

 def get_car_details(self):  
 # Dictionary to store the count of wheels from each company  
 wheel_count = {}  

 # Counting how many wheels are from each company  
 for wheel in self.wheels:  
 wheel_count[wheel.company] = wheel_count.get(wheel.company, 0) + 1  

 # Printing details  
 print(f"{self.model} car has {len(self.wheels)} wheels:")  
 for company, count in wheel_count.items():  
 print(f" - {count} wheels from {company}")  


if __name__ == "__main__":  
 # Create Wheel instances  
 wheel1 = Wheel("MRF")  
 wheel2 = Wheel("Goodyear")  
 wheel3 = Wheel("Bridgestone")  

 # Create Car instances  
 car1 = Car("Hyundai", [wheel1, wheel1, wheel1, wheel1]) # All MRF wheels  
 car2 = Car("TATA Harrier", [wheel1, wheel2, wheel2, wheel1]) # Mixed companies  
 car3 = Car("Ford Mustang", [wheel3, wheel3, wheel1, wheel1]) # Mixed companies  

 # Display car details  
 car1.get_car_details()  
 car2.get_car_details()  
 car3.get_car_details()

вивід:

Hyundai car has 4 wheels:
— 4 wheels from MRF
TATA Harrier car has 4 wheels:
— 2 wheels from MRF
— 2 wheels from Goodyear
Ford Mustang car has 4 wheels:
— 2 wheels from Bridgestone
— 2 wheels from MRF

Пояснення агрегації:

  1. Відносини агрегації:
  • Клас Car містить список об'єктів Wheel. Це означає, що Car може мати кілька Wheel, але Wheel є незалежними та не належать до Car. Колесо може бути використане в різних автомобілях, і навіть якщо автомобіль знищується, колеса все ще існують і можуть бути використані в іншому автомобілі.

2. Незалежність коліс:

  • Об'єкти Wheel створюються незалежно, а потім асоціюються з автомобілем. У прикладі використовуються кілька коліс від різних виробників (наприклад, MRF, Goodyear та Bridgestone), і ці колеса можуть існувати поза межами Car. Якщо автомобіль буде видалений з системи, колеса все одно залишаються та можуть бути призначені іншому автомобілю.

3. Відсутність власності:

  • Агрегація не означає власність, тобто якщо Car буде видалено, об'єкти Wheel не будуть видалені. Вони можуть існувати незалежно від об'єкта Car. Колеса просто "належать" автомобілю в контексті їх асоціації, але вони не залежні від автомобіля.

Перекладено з: Mastering Object-Oriented Relationships: The Difference Between Association, Aggregation, Composition, and Generalization

Leave a Reply

Your email address will not be published. Required fields are marked *