Stan
ну вот задача, есть класс орел, есть класс лев, хочу класс грифон как это реализовать на тайпскрипт например?
Ukrainian (Yaros) 🇨🇦
@One_of_the_Stoics ты тайпскрипт знаешь?
Работал на последней работе
Stan
Можно грифон сделать общим родителем
тогда у тебя лев летать начнет
Ukrainian (Yaros) 🇨🇦
тогда у тебя лев летать начнет
Можно создать общий базовый класс Animal и конкретные, и Орел и лев
Stan
ты знаешь что такое грифон?
Ukrainian (Yaros) 🇨🇦
А понял, множественного наследоваюания нет
Stan
да
Ukrainian (Yaros) 🇨🇦
Это же TS
Ukrainian (Yaros) 🇨🇦
Тогда композиция
Stan
или агрегация?
Ukrainian (Yaros) 🇨🇦
В питоне я бы создало класс Animal от него унаследовал бы Льва и Орла , а грифон стал бы предком их обоих
Stan
но мы не про питон
Ukrainian (Yaros) 🇨🇦
*наследником видимо
Да, потомком хотел написать
Ukrainian (Yaros) 🇨🇦
Вообщем наследником
Nikolay
В питоне я бы создало класс Animal от него унаследовал бы Льва и Орла , а грифон стал бы предком их обоих
а это точно сработало бы? кажется что Лев просто перекрыл методы Орла))
Ukrainian (Yaros) 🇨🇦
или агрегация?
Там роли не играет особого
Nikolay
Там роли не играет особого
это концептуально разные подходы)
Ukrainian (Yaros) 🇨🇦
это концептуально разные подходы)
Как я понял объекты в агригации создаются из вне и передаються в конструктор третего класса
Nikolay
У Льва же нет метода fly
ну так ты не можешь контролировать какой набор ты возьмешь от одного родителя, а какой от другого если методы и атрибуты одинаково называются
Nikolay
Как я понял объекты в агригации создаются из вне и передаються в конструктор третего класса
ну вот и вопрос, нужно ли тебе создавать льва и орла чтобы получить грифона
Nikolay
Так методы не одинаково называются, у Льва же нет метода fly, а у Орла roar
отлично, то есть ты создаешь два класса с разными названиями методов, чтобы можно было создать потомков и методы не пересекались и вот тебе нужно написать код где появляется или лев или орел и издает звук и ты уже пишешь цепочку if-ов чтобы вызвать правильный метод))
Ukrainian (Yaros) 🇨🇦
Через композицию видимо
Stan
Через композицию видимо
или через агрегацию?))
Nikolay
Через композицию видимо
для этого делают базовый класс, у которого определяют make_sound, а потом каждый наследник издает свой звук, но если их потом скрестить, то методы называются одинаково
Ukrainian (Yaros) 🇨🇦
или через агрегацию?))
Зависимо от задачи, хотя если орел и лев должны быть отдельными сущностями то да
Nikolay
Зависимо от задачи, хотя если орел и лев должны быть отдельными сущностями то да
то есть для создания каждого грифона тебе нужно существования дополнительно орла и грифона?)
Ukrainian (Yaros) 🇨🇦
Ukrainian (Yaros) 🇨🇦
Тоесть можно создать объекты внутри init класса композитора
Ukrainian (Yaros) 🇨🇦
К примеру в моделях Джанго сплошная композиция
Nikolay
В принципе можно использовать одни и теже объекты Льва и орла
тогда кто будет лететь? грифон, орел или второй грифон сделанный при помощи того же орла?)
Ukrainian (Yaros) 🇨🇦
def __init__(self, eagle:Eagle, lion: Lion):
Ukrainian (Yaros) 🇨🇦
По принципу Композиции нужно было бы создавать объект Льва и объект орла в Нутри
Ukrainian (Yaros) 🇨🇦
де?
Сами поля и менеджер
Nikolay
def __init__(self, eagle:Eagle, lion: Lion):
так и у кого будет статус is_flying когда полетит первый грифон?)
Stan
Сами поля и менеджер
в таком раскладе весь питон композиция
Nikolay
def fly(self): self.eagle.fly()
это не ответ на вопрос
Ukrainian (Yaros) 🇨🇦
Это будет метод орла
Nikolay
Это будет метод орла
ну вот допустим метод орла def fly(self): self.is_flying = True ты вызвал метод fly у первого грифона, что будет если ты проверишь is_flying у орла или у второго грифона, которого ты создал через того же орла?
Nikolay
self.eagle.is_flying будет True после первого полета
ты не отвечаешь на вопросы а eagle.is_flying что вернет? а second_griffin.is_flying что вернет?
Nikolay
True
ну ты не видишь проблемы, что ты сказал лететь одному грифону, а у тебя все грифоны и орел полетели?
Ukrainian (Yaros) 🇨🇦
Я
Все же объекты класса должны иметь свои свойства от класса
Я
Где класс
Ukrainian (Yaros) 🇨🇦
Почему они полетели?
Тут речь о том чтобы использовать одного и тоже объекта орла у всех объектов грифона
Ukrainian (Yaros) 🇨🇦
Так все грифоны полетят до вызова метода fly
Ukrainian (Yaros) 🇨🇦
Зачем
Что именно?
Stanislav
Объект а не класс
Я
Что именно?
Зачем использовать один объект орла для того чтобы летели все остальные объекты класса грифон? и как это связать? Каво
Я
Так все грифоны полетят до вызова метода fly
Переопределить метод родителя и дело с концом или переопределить свойство в инит для грифонов
Я
class Eagle: def __init__(self): self.is_flying = False # По умолчанию, орел не летит def fly(self): self.is_flying = True # Устанавливаем, что орел летит print("Eagle is now flying.") def __str__(self): return f"Eagle (Is Flying: {self.is_flying})" class Lion: def __init__(self): # Лев не имеет метода полета pass def __str__(self): return "Lion (Cannot fly)" class Griffin: def __init__(self, eagle, lion): self.eagle = eagle # Агрегируем экземпляр орла self.lion = lion # Агрегируем экземпляр льва def fly(self): self.eagle.fly() # Используем метод fly() орла print("Griffin is utilizing the eagle's flying ability.") def __str__(self): return f"Griffin (Eagle: {self.eagle}, Lion: {self.lion})" # Создаем объекты Eagle и Lion вне класса Griffin eagle = Eagle() lion = Lion() # Передаем эти объекты в конструктор Griffin griffin = Griffin(eagle, lion) # Используем метод fly() для Griffin griffin.fly() # Выводим информацию о Griffin, Eagle и Lion print(griffin)
Ukrainian (Yaros) 🇨🇦
Я
А
Я
Пон
Ukrainian (Yaros) 🇨🇦
class Eagle: def __init__(self): self.is_flying = False # По умолчанию, орел не летит def fly(self): self.is_flying = True # Устанавливаем, что орел летит print("Eagle is now flying.") def __str__(self): return f"Eagle (Is Flying: {self.is_flying})" class Lion: def __init__(self): # Лев не имеет метода полета pass def __str__(self): return "Lion (Cannot fly)" class Griffin: def __init__(self, eagle, lion): self.eagle = eagle # Агрегируем экземпляр орла self.lion = lion # Агрегируем экземпляр льва def fly(self): self.eagle.fly() # Используем метод fly() орла print("Griffin is utilizing the eagle's flying ability.") def __str__(self): return f"Griffin (Eagle: {self.eagle}, Lion: {self.lion})" # Создаем объекты Eagle и Lion вне класса Griffin eagle = Eagle() lion = Lion() # Передаем эти объекты в конструктор Griffin griffin = Griffin(eagle, lion) # Используем метод fly() для Griffin griffin.fly() # Выводим информацию о Griffin, Eagle и Lion print(griffin)
Stanislav
Почему грифон содержит льва и орла? А не просто от них наследует?
Я
?
Ukrainian (Yaros) 🇨🇦
https://t.me/pydjango_flood/5822
Stanislav
Ну ты там сам говоришь про наследование
Ukrainian (Yaros) 🇨🇦
Но речь зашла за то что методы у орла и льва могут быть с одним названием и один перекрывать второй
Ukrainian (Yaros) 🇨🇦
Хотя не понятно что именно должен делать грифон, рычать как лев или издавать звук орла
Stanislav
И как из этого следует, что в грифоне должен быть целый живой орёл?
Я
Stanislav
Мне кажется вопрос был про то, что делать если у тебя множественное наследование и часть методов родителей совпадают