Какие основные принципы лежат в основе объектно-ориентированного программирования (ООП)

Ответ

Программа считается объектно-ориентированной, если она построена на четырех ключевых принципах:

  1. Инкапсуляция — объединение данных (атрибутов) и методов для их обработки в едином объекте (классе). Внутренняя реализация скрыта от внешнего мира, а доступ к данным осуществляется через публичный интерфейс (методы). Это защищает данные от прямого неконтролируемого изменения.

  2. Наследование — механизм, позволяющий создавать новый класс (потомок) на основе существующего (родителя). Потомок перенимает атрибуты и методы родителя, может их расширять или переопределять. Это способствует переиспользованию кода.

  3. Полиморфизм — способность объектов с одинаковым интерфейсом (например, с одинаковым названием метода) иметь разную реализацию этого интерфейса. Это позволяет писать обобщенный код, который может работать с объектами разных классов.

  4. Абстракция — выделение наиболее значимых характеристик объекта и игнорирование второстепенных. В программировании это реализуется через создание абстрактных классов или интерфейсов, которые определяют общий контракт для всех своих потомков, не вдаваясь в детали их реализации.

Пример на Python, иллюстрирующий все принципы:

from abc import ABC, abstractmethod

# Абстракция: определяем общий интерфейс для всех фигур
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

# Наследование: Circle и Rectangle наследуют от Shape
class Circle(Shape):
    # Инкапсуляция: данные (radius) и методы (area) объединены в классе
    def __init__(self, radius):
        self.__radius = radius # __ делает атрибут приватным

    def area(self):
        return 3.14 * self.__radius ** 2

class Rectangle(Shape):
    def __init__(self, width, height):
        self.__width = width
        self.__height = height

    def area(self):
        return self.__width * self.__height

# Полиморфизм: функция print_area работает с любым объектом типа Shape
def print_area(shape: Shape):
    print(f"Площадь фигуры: {shape.area()}")

# Создаем объекты разных классов
circle = Circle(10)
rectangle = Rectangle(5, 4)

print_area(circle)      # Выведет: Площадь фигуры: 314.0
print_area(rectangle)   # Выведет: Площадь фигуры: 20