Module (77%)
Section (70%)

Как построить иерархию классов: продолжение

Посмотрите на пример в редакторе.

Это похоже на что-нибудь? Да, конечно. Это относится к примеру, показанному в начале модуля, когда мы говорили об общих концепциях объективного программирования.

Это может выглядеть странно, но мы никоим образом не использовали наследование - просто чтобы показать Вам, что оно не ограничивает нас, и нам удалось получить свое.

Мы определили два отдельных класса, способных производить два разных типа наземных транспортных средств. Основное различие между ними заключается в том, как они поворачиваются. Колесное транспортное средство просто поворачивает передние колеса (как правило). Гусеничный автомобиль должен остановить один из траков.

Можете ли вы пройтись по коду?

  • отслеживаемое транспортное средство выполняет поворот, останавливаясь и двигаясь по одной из своих дорожек (это выполняется методом controltrack(), который будет реализован позже);
  • колесное транспортное средство поворачивается, когда его передние колеса поворачиваются (это выполняется методом turnfrontwheels());
  • метод turn() использует метод, подходящий для каждого конкретного транспортного средства.

Видите ли Вы, что не так с кодом?

Методы turn() выглядят слишком похожими, чтобы оставлять их в такой форме.

Давайте перестроим код - мы собираемся ввести суперкласс, чтобы собрать все похожие аспекты управления транспортными средствами, перенеся все особенности в подклассы.



Code

import time

class 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)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×