Как построить иерархию классов: продолжение
Посмотрите на пример в редакторе.
Это похоже на что-нибудь? Да, конечно. Это относится к примеру, показанному в начале модуля, когда мы говорили об общих концепциях объективного программирования.
Это может выглядеть странно, но мы никоим образом не использовали наследование - просто чтобы показать Вам, что оно не ограничивает нас, и нам удалось получить свое.
Мы определили два отдельных класса, способных производить два разных типа наземных транспортных средств. Основное различие между ними заключается в том, как они поворачиваются. Колесное транспортное средство просто поворачивает передние колеса (как правило). Гусеничный автомобиль должен остановить один из траков.
Можете ли вы пройтись по коду?
- отслеживаемое транспортное средство выполняет поворот, останавливаясь и двигаясь по одной из своих дорожек (это выполняется методом
controltrack()
, который будет реализован позже); - колесное транспортное средство поворачивается, когда его передние колеса поворачиваются (это выполняется методом
turnfrontwheels()
); - метод
turn()
использует метод, подходящий для каждого конкретного транспортного средства.
Видите ли Вы, что не так с кодом?
Методы turn()
выглядят слишком похожими, чтобы оставлять их в такой форме.
Давайте перестроим код - мы собираемся ввести суперкласс, чтобы собрать все похожие аспекты управления транспортными средствами, перенеся все особенности в подклассы.
Code
import timeclass TrackedVehicle:
def control_track(left, stop):
pass
def turn(left):
control_track(left, True)
time.sleep(0.25)
control_track(left, False)
class WheeledVehicle:
def turn_front_wheels(left, on):
pass
def turn(left):
turn_front_wheels(left, True)
time.sleep(0.25)
turn_front_wheels(left, False)