Ответы пользователя по тегу ООП
  • ООП-упражнение (объектный анализ) на свободную тему "Приготовление борща", что скажете?

    @kova1ev
    В код особо не всматривался, пардон, ориентировался на комментарии в коде.

    Главное, имхо, в ООП это объединение некоторых данных и методов, которые изменяют эти данные, в единую логическую сущность под названием "класс". У вас как-то классов слишком дофига, и как-то непонятно они собраны в логические сущности. Например, класс "Повар" - там из данных вижу количество денег и массив с продуктами. Не особо вяжется это с сущностью "Повар". Или класс "Магазин" - в задаче приготовления борща нафига плодить такие сущности как склад магазина, например, или общая стоимость имеющихся в магазине продуктов. Понимаю, что задача надуманная, но все же.

    Все вышенаписанное сугубое имхо.
    Ответ написан
  • Для чего все-таки нужны интерфейсы?

    @kova1ev
    Представь у тебя есть какой-нибудь метод, который принимает в агрументах объект, например, типа User
    doSomething(User user)
    Ты можешь передавать в этот метод любой объект типа User или объекты классов, наследующих User.
    Но можно сделать еще гибче, например описать некий интерфейс UserInteface и указать в определении метода его:
    doSomething(UserInterface user)
    Теперь ты можешь передавать в метод объект любого класса, который реализует интерфейс UserInterface.
    Разумеется, изначальный класс User из этого примера тоже должен реализовывать этот интерфейс.

    То есть, указывая в типе данных параметра какой-то конкретный класс, ты привязываешься к этому классу или его наследникам, а указывая интерфейс ты привязываешься к этому интерфейсу, который может реализовать любой другой класс, связность уменьшается, а это хорошо. А если ты в этих, еще не написанных классах будешь просто писать нужные методы, то не сможешь объект этих классов использовать, тип данных то будет другой, хотя методы и будут описаны.

    И, как уже написали выше, один класс может реализовывать несколько интерфейсов.
    Ответ написан
    Комментировать
  • В чем смысл одинарного и двойного подчеркивания перед переменной или методом при определении класса?

    @kova1ev
    По поводу двойного, могли бы разъяснить. Понял, что декарируются _ИмяКласса__метод, но как это выглядит на практике не совсем понимаю


    class Base:
        def __init__(self, price):
            self.__price = price
    
    obj = Base(99)
    print(obj.__price) #ошибка
    print(obj._Base__price) #выведет значение атрибута __price

    если создать объект Base и попробовать обратиться к атрибуту __price - будет ошибка. То есть он вроде как приватный. Но на самом деле, если очень хочется, можно обратиться к нему через конструкцию obj._Base__price, ну и изменить тоже можно
    Ответ написан
    1 комментарий