Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
virtual ~Spawner() {} RSlafka 30.05.14 в 12:45 |
|
|
virtual Monster* spawnMonster() = 0; RSlafka 30.05.14 в 12:45 |
||
|
}; RSlafka 30.05.14 в 12:45 |
||
|
template <class T> RSlafka 30.05.14 в 12:45 |
||
|
class SpawnerFor : public Spawner RSlafka 30.05.14 в 12:45 |
||
|
{ RSlafka 30.05.14 в 12:46 |
||
|
public: RSlafka 30.05.14 в 12:46 |
||
|
virtual Monster* spawnMonster() { return new T(); } RSlafka 30.05.14 в 12:46 |
||
|
}; RSlafka 30.05.14 в 12:46 |
||
|
Использовать его можно так: RSlafka 30.05.14 в 12:46 |
||
|
Spawner* ghostSpawner = new SpawnerFor<Ghost>(); RSlafka 30.05.14 в 12:47 |
||
|
Код класса "Спавнер" не заботится о том, какого типа монстр будет создаваться, он просто работает с указателем на "Монстра". GromHoll 14.06.14 в 11:46 |
||
|
Если у нас есть только класс SpawnerFor<T> - не будет не единого супертипа, реализации шаблона которого были бы распространены, поэтому код, работающий со спавнерами любого типа монстра сам должен принять параметр шаблона. BaMnup16 02.03.16 в 04:33 |
||
|
Типы первого класса GromHoll 14.06.14 в 11:48 |
||
|
В предыдущих двух решениях, мы решили задачу, создав класс Spawner, который настраивался типом. GromHoll 14.06.14 в 11:51 Два предыдущих решения выявили необходимость в типизируемом классе Spawner. Deo 25.08.14 в 06:51 |
||
|
В С++ типы, в целом, не являются типами первого класса, так что потребуется некоторая ловкость. GromHoll 14.06.14 в 11:54 |
||
|
Если вы используете языки с динамической типизацией, такие как JavaScript, Python или Ruby, где классы являются обычными объектами, которые можно передавать, вы можете решить это напрямую. GromHoll 14.06.14 в 11:56 |
||
|
В некотором смысле, шаблон "Type Object" является одним из способов обойти отсутствие типов первого класса. GromHoll 14.06.14 в 11:58 |
||
|
Этот шаблон так же может быть полезен в языках с ними, потому что он позволяет вам определить что же такое "тип". GromHoll 14.06.14 в 12:00 Этот паттерн полезен и для языков, где такие типы есть,так как он позволяет определить, что является "типом". Deo 25.08.14 в 07:02 |
||
|
Вам может захотеться отличной от встроенной в язык семантики классов. Deo 25.08.14 в 07:06 |
||
|
Когда вы делаете спавнер, просто передайте класс монстра, который требуется создавать - буквально, объект, который представляет класс монстра во время выполнения. GromHoll 14.06.14 в 12:09 |
||
|
Проще простого. GromHoll 14.06.14 в 12:11 |
||
|
Со всеми этими вариантами я, если честно, так и не нашёл случая, когда шаблон "Прототип" являлся бы лучшим решением. GromHoll 14.06.14 в 12:13 |
||
|
Возможно, ваш опыт будет отличаться, но давайте отложим сейчас это в сторону и поговорим чём-то другом: прототипы как парадигма языка. GromHoll 14.06.14 в 12:15 |
||
|
Прототипное программирование GromHoll 14.06.14 в 12:16 |
||
|
Многие люди считают, что "объектно-ориентированное программирование" - это синоним "классу". Определения ООП сродни противоположным религиозным конфессиям, но неоспоримо следующее - ООП позволяет определить "объекты" как набор данных и поведения. GromHoll 14.06.14 в 12:20 |
||
|
По сравнению со структурными языками, как C, и функциональными языками, как Scheme, определяющей характеристикой ООП является то, что он прочно связывается состояние и поведение вместе. GromHoll 14.06.14 в 12:22 |
||
|
Вы можете считать, что классы - это единственный способ реализовать это, но горстка парней, в том числе Dave Ungar и Randall Smith, позволили себе не согласиться. GromHoll 14.06.14 в 12:24 |
||
|
В 80х они создали язык названный Self. GromHoll 14.06.14 в 12:25 В 80х был создан язык под названием Self. Deo 25.08.14 в 07:07 |
||
|
Это всё ещё ООП, но без классов. GromHoll 14.06.14 в 12:26 Максимальный ООП, но без классов. Deo 25.08.14 в 07:08 |
||
|
Self GromHoll 14.06.14 в 12:26 |
||
|
В чистом виде, Self более объектно-ориентированный, чем язык на основе классов. GromHoll 14.06.14 в 12:26 |
||
|
Мы думаем, что ООП сводит состояние и поведение вместе, но языки с классами имеют линию, разделяющую их. GromHoll 14.06.14 в 12:28 |
||
|
Рассмотрим семантику вашего любимого языка, основанного на классах. GromHoll 14.06.14 в 12:28 |
||
|
Что бы получить некое состояние объекта, вы проверяете память самим экземпляром. GromHoll 14.06.14 в 16:56 |
||
|
Состояние содержится в экземпляре. GromHoll 14.06.14 в 16:56 |
||
|
Тем не менее, что бы вызвать метод, вы сначала проверить класс экземпляра, и затем уже заметите есть ли этот метод. GromHoll 14.06.14 в 16:59 |
||
|
Поведение содержится в классе. GromHoll 14.06.14 в 17:00 |
||
|
Экземпляр просто ссылка на класс. GromHoll 14.06.14 в 17:00 |
||
|
Всегда присутствует промежуточный уровень доступа к методу. GromHoll 14.06.14 в 17:13 |
||
|
Например, вызывая виртуальный метод в C++, вы проверите у экземпляра указатель на его виртуальную таблицу и затем найдёте метод в ней. GromHoll 17.06.14 в 11:51 |
||
|
Self устраняет это разграничение. GromHoll 17.06.14 в 11:51 |
||
|
Что бы что-то найти, вы просто проверяете объект. GromHoll 17.06.14 в 11:52 |
||
|
Экземпляр может содержать как состояние, так и поведение. GromHoll 17.06.14 в 11:53 |
||
|
Вы можете иметь один объект, имеющий полностью уникальный для него метод. GromHoll 17.06.14 в 11:54 |
||
|
Один в поле не воин, но этот объект - воин. GromHoll 17.06.14 в 11:55 |
+1 | |
|
Если бы всё Self был таким, его было бы сложно использовать. GromHoll 17.06.14 в 11:57 Если бы это было все, что делал Self, его было бы сложно использовать. Deo 25.08.14 в 07:15 |
||
|
Наследование в языках основанных на классах, несмотря на его недостатки, дает полезный механизм для повторного использования полиморфного кода и избежания дублирования. GromHoll 17.06.14 в 11:58 |
||
|
Что бы сделать что-то похожее без классов, Self имеет делегирование. GromHoll 17.06.14 в 11:59 Чтобы достигать такого без классов, у Self есть делегирование. Deo 25.08.14 в 07:37 |
||
|
Чтобы найти поле или вызвать метод некоторого объекта, мы сначала посмотрим на сам объект. GromHoll 17.06.14 в 12:00 Чтобы найти поле или вызвать метод некоторого объекта, сначала заглянем в сам объект. Deo 25.08.14 в 07:40 |
