gpt4 book ai didi

c# - 以抽象类的子类数组作为参数的构造函数

转载 作者:行者123 更新时间:2023-12-02 01:08:37 24 4
gpt4 key购买 nike

我正在为一款游戏开发玩家库存系统。

我有一个结构Slot,它有一个List 集合,表示其中允许哪些类型的项目。抽象类 Loot 是所有可掠夺元素的子类 - 即:将是 Slot 结构的有效内容值。

我想表达的是,可以对其可以包含的战利品子类进行限制。例如,如果Slot代表一个弹药容器,我希望它只容纳Loot子类,它们是弹药容器,例如“Quivers”和“Shot Pouches”(这将沿线某处子类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
}

}

我不知道如何在 PlayerInventory 类的 Main 方法中的 Slot 构造函数调用中为 Loot 子类提供参数。

我希望这一点很清楚。提前致谢。

编辑

我能够使用 David Sieler 的方法和一些反射来解决这个问题(我的意思是让它编译)。

插槽结构


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)));

再次感谢大家的讨论。

最佳答案

您可能会发现在 Slot 构造函数的定义中使用 params 更容易:

Slot(params Loot[] exclusiveLootTypes)

这将允许你这样调用它:

new Slot(lootItem1, lootItem2, lootItem2 /*...etc*/);

否则,您需要创建一个数组并将其传入。

关于c# - 以抽象类的子类数组作为参数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1895186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com