И наконец, каждый класс устанавливает переменную экземпляра self.shapeType в соответствующую строку.
Всякий раз, находя набор классов, который реализует абсолютно одинаковый метод и/или содержит общий код в методе
с общим именем, мы должны признать его хорошим кандидатом для наследования.
318 Часть III. Инкапсуляция, полиморфизм и наследование
Давайте извлечем общий код из трех классов и создадим общий базовый класс с именем Shape, продемонстрированный
в листинге 10.6.
Файл: InheritedShapes/ShapeBasic.py
# Класс Shape – базовый
import random
# Настраиваем цвета
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
class Shape():
def getType(self):
return self.shapeType
Листинг 10.6. Класс Shape для использования в качестве базового класса
Класс состоит только из двух методов: __init__() и
getType(). Метод __init__() запоминает данные, переда-
ваемые в переменные экземпляров, затем произвольным образом выбирает цвет и начальное местоположение (self.x
и self.y). Метод getType() лишь возвращает тип фигуры,
заданной инициализацией.
Теперь мы можем написать любое число подклассов, которые наследуют от Shape. Создадим три подкласса, которые будут вызывать метод __init__() класса Shape, передавая строку, определяющую его тип и размер окна. Метод getType()
появится лишь в классе Shape, поэтому любой клиентский вызов getType() будет обрабатываться этим методом в унаследованном классе Shape. Мы начнем с кода класса Square, который продемонстрирован в листинге 10.7.
Класс Square начинается с наследования от класса Shape .
Метод __init__() вызывает метод __init__() его базового
класса (или суперкласса) , определяя фигуру как квадрат
и произвольно выбирая ее размер.
Далее у нас идут три метода, реализация которых специфична для квадрата. Методу clickedInside() всего лишь требуется вызвать rect.collidepoint(), чтобы определить, был ли
щелчок внутри прямоугольника . Метод getArea() просто
умножает widthAndHeight на widthAndHeight . И наконец,
метод draw() рисует прямоугольник с помощью значения
widthAndHeight .
В листинге 10.8 продемонстрирован класс Circle, который
также был изменен, чтобы наследовать от класса Shape.
320 Часть III. Инкапсуляция, полиморфизм и наследование
Последние комментарии
2 дней 8 часов назад
2 дней 9 часов назад
2 дней 9 часов назад
2 дней 9 часов назад
2 дней 11 часов назад
2 дней 11 часов назад