Я работаю над системой инвентаризации игроков для игры.
У меня есть структура Slot, в которой есть коллекция List‹Loot›, представляющая, какие виды предметов разрешены в ней. Абстрактный класс Loot является подклассом всех предметов, которые можно разграбить, т. е.: будут действительными значениями содержимого для структуры Slot.
Я хочу подчеркнуть, что Slot может иметь ограничения на то, какие подклассы Loot он может содержать. Например, если Slot представляет собой контейнер с боеприпасами, я хочу, чтобы он содержал только подклассы Loot, которые являются контейнерами с боеприпасами, такие как «Колчаны» и «Подсумки» (которые подкласс Container где-то в этой строке).
Класс добычи
public abstract class Loot : GameEntity, ILootable
{
public int MaxUnitsPerStack { get; set; }
public int MaxUnitsCarriable { get; set; }
public int MaxUnitsOwnable { get; set; }
public void Stack() { }
public void Split() { }
public void Scrap() { }
}
Класс-контейнер
public abstract class Container : Loot
{
public List<Slot> Slots { get; set; }
public Container(int slots)
{
this.Slots = new List<Slot>(slots);
}
}
Структура слота
public struct Slot
{
public Loot Content;
public int Count;
public List<Loot> ExclusiveLootTypes;
public Slot(Loot[] exclusiveLootTypes)
{
this.Content = null;
this.Count = 0;
List<Loot> newList;
if (exclusiveLootTypes.Count() > 0)
{
newList = new List<Loot>(exclusiveLootTypes.Count());
foreach (Loot l in exclusiveLootTypes)
{
newList.Add(l);
}
}
else { newList = new List<Loot>(); }
this.ExclusiveLootTypes = newList;
}
}
Инвентарь игрока
public struct PlayerInventory
{
static Dictionary<Slot, string> Slots;
static void Main()
{
Slots = new Dictionary<Slot, string>();
/* Add a bunch of slots */
Slots.Add(new Slot(/* I don't know the
syntax for this:
Quiver, Backpack */), "Backpack"); // Container
}
}
Я не знаю, как предоставить аргументы для подклассов Loot в вызове конструктора Slot в методе Main класса PlayerInventory.
Я надеюсь, что это ясно. Заранее спасибо.
ИЗМЕНИТЬ
Я смог решить эту проблему (и под этим я подразумеваю компиляцию), используя подход Дэвида Зилера вместе с некоторым отражением.
Структура слота
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
public struct Slot
{
private Loot _content;
private int _count;
public List ExclusiveLootTypes;
public Loot Content
{
get { return _content; }
private set
{
if ((ExclusiveLootTypes.Contains(value.GetType())) && (value.GetType().IsSubclassOf(Type.GetType("Loot"))))
{
_content = value;
}
}
}
public int Count
{
get { return _count; }
set { _count = value; }
}
public Slot(params Type[] exclusiveLootTypes)
{
this._content = null;
this._count = 0;
List newList;
if (exclusiveLootTypes.Count() > 0)
{
newList = new List(exclusiveLootTypes.Count());
foreach (Type l in exclusiveLootTypes)
{
newList.Add(l);
}
}
else { newList = new List(); }
this.ExclusiveLootTypes = newList;
}
}
Вызов PlayerInventory для конструктора Slot
Slots.Add(new Slot(typeof(Backpack)));
Еще раз спасибо всем за обсуждение.
Loot
тип добычи или реальную добычу, потому что я забыл идею, которая у меня была при написании. Таким образом, кажется, вам просто нужно передать возможные типы добычи конструкторуSlot
, как показано в ответе @Anon, хотя, вероятно, существует много типов добычи, которые можно поместить в рюкзак. Вы думали об интерфейсе, который реализует типы добычи, которые можно поместить в рюкзак? - person dtb   schedule 13.12.2009List<Loot>
очень похоже на список типов лута, который может быть возможным содержимым слота, не так ли? - person dtb   schedule 13.12.2009ExclusiveLootTypes
очень запутанным :-) Я думаю, вам следует взглянуть на ответ @Cameron MacFarland; это кажется лучшим решением. С другой стороны, я бы, наверное, отказался от концепции слотов. В любом случае, все слоты в колчане равны, верно? - person dtb   schedule 13.12.2009Dictionary<Loot,int>
. - person dtb   schedule 13.12.2009