Класс для класса
На самом высоком уровне проблема очень проста. У нас
в игре есть множество различных монстров, и мы хотим
разделить между ними определенные характеристики.
Орда монстров атакует героя, а мы хотим, чтобы неко-
торые из них при этом использовали один и тот же текст
во время атаки. Мы можем объявить о принадлежности
монстров к одному «роду», а род уже определит строку
атаки.
Мы решили реализовать концепцию с помощью
наследования, поскольку оно интуитивно и отража-
ет наше понимание классов. Дракон — это монстр,
и каждый дракон в игре — экземпляр «класса» дракон.
Определение каждого рода монстров как подкласс ба-
зового класса
Monster
и каждого монстра в игре как
экземпляра производного класса идеально отражает
наш замысел. В итоге мы получаем вот такую иерар-
хию классов (рис. 13.1).
Рис. 13.1.
Слишком много подклассов
Здесь
обозначает
«наследует от»
252
Объект типа (Type Object) —
Паттерны программирования игр
Каждый экземпляр в игре будет принадлежать к од-
ному из производных типов монстров. И чем больше ро-
дов у нас будет, тем больше будет иерархия. Вот и про-
блема: добавление нового рода приводит к добавлению
нового кода, да и каждый род должен компилироваться
как отдельный тип.
Такое решение неплохое, но есть и другие. Мы можем
построить архитектуру кода таким образом, что каждо-
му монстру род будет
принадлежать
. Мы не станем каж-
дый род определять как подкласс
Monster
, а создадим
единственный класс
Breed
(рис. 13.2).
Рис. 13.2.
Два класса, бесконечное количество родов
Итак, два класса. Обратите внимание: никакого насле-
дования! При такой реализации каждый монстр в игре яв-
ляется просто экземпляром класса
Monster
. Класс
Breed
содержит информацию, общую для всех монстров одного
рода: начальный показатель здоровья и строка атаки.
Чтобы связать каждого монстра с определенным ро-
дом, каждому экземпляру класса
Monster
дадим ссыл-
ку на объект
Breed
, где будет содержаться информа-
ция для конкретного рода. Для доступа к строке атаки
монстр просто вызывает соответствующий метод в сво-
ем роде. Класс
Breed
, по сути, определяет «тип» мон-
стра. Каждый экземпляр рода —
объект
, представляю-
щий определенный смысловой
тип
, отсюда и название
паттерна: Объект типа (Type Object).
Мощь этого паттерна в том, что теперь мы можем
определять новые
типы
чего-либо без необходимости
усложнять код. По сути, мы подняли часть системы типов
из жестко закодированной иерархии классов к данным,
которые мы можем определять во время выполнения.
Мы можем создать сотни различных родов, добавляя
экземпляры
Breed
с различными значениями. А если
Здесь
обозначает
«ссылается на».
Do'stlaringiz bilan baham: |