Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

virtual ~Spawner() {}

RSlafka 30.05.14 в 12:45

0

virtual Monster* spawnMonster() = 0;

RSlafka 30.05.14 в 12:45

0

};

RSlafka 30.05.14 в 12:45

0

template <class T>

RSlafka 30.05.14 в 12:45

0

class SpawnerFor : public Spawner

RSlafka 30.05.14 в 12:45

0

{

RSlafka 30.05.14 в 12:46

0

public:

RSlafka 30.05.14 в 12:46

0

virtual Monster* spawnMonster() { return new T(); }

RSlafka 30.05.14 в 12:46

0

};

RSlafka 30.05.14 в 12:46

0

Использовать его можно так:

RSlafka 30.05.14 в 12:46

0

Spawner* ghostSpawner = new SpawnerFor<Ghost>();

RSlafka 30.05.14 в 12:47

0

Код класса "Спавнер" не заботится о том, какого типа монстр будет создаваться, он просто работает с указателем на "Монстра".

GromHoll 14.06.14 в 11:46

0

Если у нас есть только класс SpawnerFor<T> - не будет не единого супертипа, реализации шаблона которого были бы распространены, поэтому код, работающий со спавнерами любого типа монстра сам должен принять параметр шаблона.

BaMnup16 02.03.16 в 04:33

0

Типы первого класса

GromHoll 14.06.14 в 11:48

0

В предыдущих двух решениях, мы решили задачу, создав класс Spawner, который настраивался типом.

GromHoll 14.06.14 в 11:51

0

Два предыдущих решения выявили необходимость в типизируемом классе Spawner.

Deo 25.08.14 в 06:51

0

В С++ типы, в целом, не являются типами первого класса, так что потребуется некоторая ловкость.

GromHoll 14.06.14 в 11:54

0

Если вы используете языки с динамической типизацией, такие как JavaScript, Python или Ruby, где классы являются обычными объектами, которые можно передавать, вы можете решить это напрямую.

GromHoll 14.06.14 в 11:56

1

В некотором смысле, шаблон "Type Object" является одним из способов обойти отсутствие типов первого класса.

GromHoll 14.06.14 в 11:58

1

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

GromHoll 14.06.14 в 12:00

0

Этот паттерн полезен и для языков, где такие типы есть,так как он позволяет определить, что является "типом".

Deo 25.08.14 в 07:02

0

Вам может захотеться отличной от встроенной в язык семантики классов.

Deo 25.08.14 в 07:06

0

Когда вы делаете спавнер, просто передайте класс монстра, который требуется создавать - буквально, объект, который представляет класс монстра во время выполнения.

GromHoll 14.06.14 в 12:09

0

Проще простого.

GromHoll 14.06.14 в 12:11

0

Со всеми этими вариантами я, если честно, так и не нашёл случая, когда шаблон "Прототип" являлся бы лучшим решением.

GromHoll 14.06.14 в 12:13

0

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

GromHoll 14.06.14 в 12:15

0

Прототипное программирование

GromHoll 14.06.14 в 12:16

0

Многие люди считают, что "объектно-ориентированное программирование" - это синоним "классу". Определения ООП сродни противоположным религиозным конфессиям, но неоспоримо следующее - ООП позволяет определить "объекты" как набор данных и поведения.

GromHoll 14.06.14 в 12:20

0

По сравнению со структурными языками, как C, и функциональными языками, как Scheme, определяющей характеристикой ООП является то, что он прочно связывается состояние и поведение вместе.

GromHoll 14.06.14 в 12:22

0

Вы можете считать, что классы - это единственный способ реализовать это, но горстка парней, в том числе Dave Ungar и Randall Smith, позволили себе не согласиться.

GromHoll 14.06.14 в 12:24

0

В 80х они создали язык названный Self.

GromHoll 14.06.14 в 12:25

0

В 80х был создан язык под названием Self.

Deo 25.08.14 в 07:07

0

Это всё ещё ООП, но без классов.

GromHoll 14.06.14 в 12:26

0

Максимальный ООП, но без классов.

Deo 25.08.14 в 07:08

0

Self

GromHoll 14.06.14 в 12:26

0

В чистом виде, Self более объектно-ориентированный, чем язык на основе классов.

GromHoll 14.06.14 в 12:26

0

Мы думаем, что ООП сводит состояние и поведение вместе, но языки с классами имеют линию, разделяющую их.

GromHoll 14.06.14 в 12:28

0

Рассмотрим семантику вашего любимого языка, основанного на классах.

GromHoll 14.06.14 в 12:28

0

Что бы получить некое состояние объекта, вы проверяете память самим экземпляром.

GromHoll 14.06.14 в 16:56

0

Состояние содержится в экземпляре.

GromHoll 14.06.14 в 16:56

0

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

GromHoll 14.06.14 в 16:59

0

Поведение содержится в классе.

GromHoll 14.06.14 в 17:00

0

Экземпляр просто ссылка на класс.

GromHoll 14.06.14 в 17:00

0

Всегда присутствует промежуточный уровень доступа к методу.

GromHoll 14.06.14 в 17:13

0

Например, вызывая виртуальный метод в C++, вы проверите у экземпляра указатель на его виртуальную таблицу и затем найдёте метод в ней.

GromHoll 17.06.14 в 11:51

0

Self устраняет это разграничение.

GromHoll 17.06.14 в 11:51

0

Что бы что-то найти, вы просто проверяете объект.

GromHoll 17.06.14 в 11:52

0

Экземпляр может содержать как состояние, так и поведение.

GromHoll 17.06.14 в 11:53

0

Вы можете иметь один объект, имеющий полностью уникальный для него метод.

GromHoll 17.06.14 в 11:54

0

Один в поле не воин, но этот объект - воин.

GromHoll 17.06.14 в 11:55

0
+1

Если бы всё Self был таким, его было бы сложно использовать.

GromHoll 17.06.14 в 11:57

0

Если бы это было все, что делал Self, его было бы сложно использовать.

Deo 25.08.14 в 07:15

0

Наследование в языках основанных на классах, несмотря на его недостатки, дает полезный механизм для повторного использования полиморфного кода и избежания дублирования.

GromHoll 17.06.14 в 11:58

0

Что бы сделать что-то похожее без классов, Self имеет делегирование.

GromHoll 17.06.14 в 11:59

0

Чтобы достигать такого без классов, у Self есть делегирование.

Deo 25.08.14 в 07:37

0

Чтобы найти поле или вызвать метод некоторого объекта, мы сначала посмотрим на сам объект.

GromHoll 17.06.14 в 12:00

0

Чтобы найти поле или вызвать метод некоторого объекта, сначала заглянем в сам объект.

Deo 25.08.14 в 07:40

0
Минутку...

← Предыдущая страница

Следующая страница →