Я пишу движок MUD и только что приступил к модели игровых объектов, которая должна быть расширяемой.
Мне нужна помощь главным образом потому, что то, что я сделал, кажется грязным, но я не могу придумать другое решение, которое работает лучше.
У меня есть класс с именем MudObject
, а другой класс с именем Container
. Контейнер может содержать несколько MudObjects
, но сам по себе является MudObject
, однако MudObject
необходимо знать, в чем они содержатся. .
Так они выглядят примерно так:
public abstract class MudObject
{
Container containedBy;
}
public abstract class Container : MudObject
{
List<MudObject> Contains;
}
(обратите внимание, это всего лишь пример, и некоторые классификаторы и модификаторы доступа, свойства и тому подобное пропущены)
Теперь это само по себе кажется грязным, но давайте добавим еще кое-что к смеси:
Item
- это MudObject
, от которого будут унаследованы все визуальные предметы (например, оружие), однако некоторые из них также должны быть контейнерами (например, сундуки). Но в C # нет такого, как множественное наследование, так что все сводится к интерфейсам, лучший выбор - сделать контейнер интерфейсом (насколько я вижу). Однако была причина, по которой я не хотел, чтобы это было, то, что добавление MudObject
к контейнеру заставит контейнер обновлять значение MudObject
s .containedBy
.
Есть идеи, которые могли бы сделать эту работу, или я попал в ловушку усложнения вещей?
Если так, что еще вы могли бы предложить?