我不确定用什么技术术语来描述这种情况,所以这里是我的情况。C#:函数返回类型覆盖对象转换吗?
语境:
我设计一个项目系统游戏。目前,存在一个包含基本参数(如Id,名称,图标等)的BaseGameItem类... 迄今为止,还存在从它派生的另一个类,称为PickupItem,它实现了IPickupItem。所有似乎都很好,直到我尝试通过Item Spawner初始化这些对象。
的关键思想是,存在一个持久的数据库,所述 产卵指初始化对象时,它然后前进到 吐出如所示的完全初始化的对象:
/// <summary>
/// Initialize Game Item:
/// Given an Item ID, constructs a BaseGameItem object and returns it to instigator.
/// Refers to ItemInfoTable to initialize object parameters.
/// </summary>
/// Paramater - Int ID: The provided Item ID
/// Parameter - out BaseGameItem Item: The constructed object returned to the instigator.
public static void InitializeGameItem(int id, out BaseGameItem item)
{
FItemInfoData itemInfoData = ItemTable.Find(x => x.ItemID == id);
if(itemInfoData.ItemID != id)
{
itemInfoData = ItemTable[0];
}
// Check if item is a Pickup. If so, then item is returned as a PickupPlaceable.
// Otherwise, initialize to BaseGameItem.
item = itemInfoData.IsPickupItem ? new PickupPlaceable() : new BaseGameItem();
item.SetItemName(itemInfoData.ItemName);
item.SetItemDescription(itemInfoData.ItemDescription);
item.SetItemIcon(itemInfoData.ItemIcon);
item.SetItemMesh(itemInfoData.ItemMesh);
}
我的问题如下:
- 为了知道我应该返回哪个类或项目是实现什么接口ing,我在数据库中包含一个布尔值,检查它是否是Pickup对象。这是一个明智的决定吗?如果您能指导我阅读这种场景中使用的文章或设计模式,我将非常感激。
- 但我主要关心的是返回类型。我使用out关键字并输出一个BaseGameItem对象。但是,在我的三元条件下,我可以将其初始化为派生Pickup项目。函数输出是否会将其强制转换为BaseGameItem,并因此会丢失所有拾取功能?或者它是否将任何派生类解释为有效的返回类型?
- 如果将对象作为BaseGameItem返回,不管接收者是否应该知道他们必须将其转换为派生类?如何解决这个问题,我是否简单地返回一个布尔值,指示它是初始化函数内的Pickup,以便接收者知道何时适当地进行转换?
当你真正运行的代码发生了什么事? – Servy
我认为这个问题更适合于[代码评论](https://codereview.stackexchange.com/) – Xiaoy312
值得注意的是,当你投射时你不会失去对象上的功能;你只是失去了访问功能。 –