С этим многие могут не согласиться, но я не команда, и это работает для меня (в большинстве случаев).
Вместо того, чтобы думать о каждом Объекте как о коллекции вещи , думайте о ней как о коллекции ссылок на вещи . По сути, вместо одного огромного списка из множества
Object
- Position
- Legs
- [..n]
У вас было бы что-то вроде этого (с удаленными значениями, оставляя только отношения):
Всякий раз, когда ваш игрок (или существо, или [..n]) хочет открыть ящик, просто позвоните
Player.Open(Something Target); //or
Creature.Open(Something Target); //or
[..n].Open(Something Target);
Где «Нечто» может быть набором правил или просто целым числом, которое идентифицирует цель (или даже лучше, сама цель ), если цель существует и действительно может быть открыта, откройте ее .
Все это может (вполне) легко быть реализовано с помощью ряда, скажем, интерфейсов, например:
interface IDraggable
{
void DragTo(
int X,
int Y
);
}
interface IDamageable
{
void Damage(
int A
);
}
При грамотном использовании этих интерфейсов вы можете даже использовать такие вещи, как делегаты, для создания абстракции между верхним уровнем
IDamageable
и подуровень
IBurnable
Надеюсь, это помогло:)
РЕДАКТИРОВАТЬ: Это было неловко, но, кажется, я угнал ответ @ munificent! Я извиняюсь @muntiful! В любом случае, посмотрите на его пример, если вам нужен фактический пример вместо объяснения того, как работает концепция.
РЕДАКТИРОВАТЬ 2: О дерьмо. Я только что увидел, что вы четко заявили, что не хотите ничего из того, что содержалось в статье, на которую вы ссылались, , что совершенно точно соответствует тому, что я написал здесь ! Не обращайте внимания на этот ответ, если вам нравится, и извините за это!