99% ресурсов, которые я нашел по шаблонам проектирования, написаны на Java, и у меня возникают проблемы с переводом. Одна книга, которой я пытаюсь следовать (Head First Design Patterns), достаточно логична, но все ломается, когда я пытаюсь написать что-то подобное.
Конкретно сейчас (думаю?) Я реализую шаблон стратегии через интерфейс; У меня есть класс акулы, который вызывает интерфейс еды, который имеет разные методы в зависимости от диеты.
Код: Выделить всё
from abc import ABC, abstractmethod
class eatInterface(ABC):
@abstractmethod
def eat(self):
pass
class hunt(eatInterface):
def eat(self):
return 'is hunting'
class filter_feed(eatInterface):
def eat(self):
return 'is filter feeding'
Код: Выделить всё
class Shark():
def __init__(self, shark_id, tag_id):
self.shark_id = shark_id
self.species = 'Shark'
self.tag_id = tag_id
self.eat_behaviour = eatInterface
def eat(self):
print(self.species + ' ' + str(self.shark_id) + str() + self.eat_behaviour.eat() + '.')
class GreatWhite(Shark):
def __init__(self, shark_id, tag_id):
super().__init__(shark_id, tag_id)
self.species = 'Great White Shark'
eat_behaviour = hunt
Код: Выделить всё
Sharks = []
Sharks.append(GreatWhite(shark_id=1,tag_id=583))
def sharktest():
for shark in Sharks:
shark.eat()
sharktest()
Код: Выделить всё
self.eat_behaviour.eat(self)
Я еще немного прочитал и увидел примеры, когда базовый класс (акула здесь) сделан абстрактным. и метод (eat) перегружен(?) в каждом конкретном классе (например, GreatWhite). Существует множество примеров использования для этого фигур и площадей/периметров.
Если это так, то какой смысл вообще создавать абстрактный класс/интерфейс, если вам приходится определять функцию в каждом в любом случае конкретный класс?
Подробнее здесь: https://stackoverflow.com/questions/788 ... ct-classes