我不确定用什么技术术语来描述这种情况,所以这是我的情况。
上下文
我正在为游戏设计一个Item系统。目前,存在一个BaseGameItem类,它包含基本参数,如Id,name,icon等... 到目前为止,存在另一个派生自它的类,称为PickupItem,它实现了IPickupItem。在我尝试通过Item Spawner初始化这些对象之前,一切似乎都很好。
关键的想法是,存在一个持久性数据库 spawner指的是在初始化对象时,它会继续进行 吐出完全初始化的对象,如下所示:
// View/JS
function onRemoveFile(e) {
$.post('@Html.Url("RemoveAsync", "Intel")', e.files, function(response) {
alert(response);
});
}
我的问题如下:
答案 0 :(得分:0)
为了知道我应该返回哪个类或项目正在实现什么接口,我在数据库中包含了一个布尔值,用于检查它是否是一个Pickup对象。这是明智的决定吗?如果您可以指导我在这种情况下使用的文章或设计模式,我将非常感激。
然而,我主要担心的是返回类型。我正在使用out关键字并输出BaseGameItem对象。但是,在我的三元条件下,我可以将其初始化为派生的Pickup项目。函数输出会将其转换为BaseGameItem,因此会丢失所有的Pickup功能吗?或者它是否将任何派生类解释为有效的返回类型?
返回类型不会丢失向上转换的功能:
基类可以定义和实现虚方法,派生类可以覆盖它们,这意味着它们提供了自己的定义和实现。在运行时,当客户端代码调用该方法时,CLR会查找该对象的运行时类型,并调用该方法的覆盖。因此,在源代码中,您可以在基类上调用方法,并导致派生类的方法版本被执行。
- Polymorphism (C# Programming Guide)
如果对象以BaseGameItem的形式返回,那么接收者是否应该知道他们必须将它转换为派生类?如何解决问题,我只是返回一个布尔值,表明它在初始化函数中是一个拾取器,以便接收器知道何时适当地转换?
不,"因此,在源代码中,您可以在基类上调用方法,并导致派生类的方法版本被执行。"但是,如果您需要派生类中的特定功能,例如PickupPlaceable.Pickup()
,则必须先将其向下转发
编辑:
问题变成了,接收者如何知道是否应该投射基础项目。
您始终可以使用is
或as
关键字检查是否可以选择某个项目:
if (item is PickupPlaceable)
{
var loot = (PickupPlaceable)item;
loot.Pickup();
}
var loot = item as PickupPlaceable;
if (loot != null)
{
loot.Pickup();
}