C#:函数返回类型是否覆盖对象强制转换?
我不确定用什么技术术语来描述这个场景,所以这里是我的案例 上下文: 我正在为一个游戏设计一个项目系统。目前,存在一个BaseGameItem类,该类包含基本参数,如Id、名称、图标等。。。 到目前为止,还存在从它派生的另一个类,称为PickupItem,它实现了IPickupItem。在我尝试通过项目生成器初始化这些对象之前,一切似乎都很好 关键思想是,存在一个 产卵器是指在初始化对象时,它会继续 吐出完全初始化的对象,如图所示:C#:函数返回类型是否覆盖对象强制转换?,c#,inheritance,unity3d,interface,polymorphism,C#,Inheritance,Unity3d,Interface,Polymorphism,我不确定用什么技术术语来描述这个场景,所以这里是我的案例 上下文: 我正在为一个游戏设计一个项目系统。目前,存在一个BaseGameItem类,该类包含基本参数,如Id、名称、图标等。。。 到目前为止,还存在从它派生的另一个类,称为PickupItem,它实现了IPickupItem。在我尝试通过项目生成器初始化这些对象之前,一切似乎都很好 关键思想是,存在一个 产卵器是指在初始化对象时,它会继续 吐出完全初始化的对象,如图所示: // ///初始化游戏项目: ///给定项目ID,构造BaseG
//
///初始化游戏项目:
///给定项目ID,构造BaseGameItem对象并将其返回给煽动者。
///引用ItemInfoTable以初始化对象参数。
///
///Paramater-Int-ID:提供的项目ID
///参数-out BaseGameItem:构造的对象返回给煽动者。
公共静态void初始值egameitem(int-id,out-BaseGameItem)
{
FItemInfoData itemInfoData=ItemTable.Find(x=>x.ItemID==id);
if(itemInfoData.ItemID!=id)
{
itemInfoData=ItemTable[0];
}
//检查项目是否为皮卡。如果是,则项目作为皮卡可替换项返回。
//否则,初始化为BaseGameItem。
item=itemInfoData.IsPickupItem?新的PickupReplacable():新的BaseGameItem();
item.SetItemName(itemInfoData.ItemName);
item.SetItemDescription(itemInfoData.ItemDescription);
item.SetItemIcon(itemInfoData.ItemIcon);
item.SetItemMesh(itemInfoData.ItemMesh);
}
我的问题如下:
pickupReplacable.Pickup()
,您必须先将其向下转换
编辑:
问题是,接收者如何知道是否应该投下基本项
您始终可以使用is
或as
关键字检查是否可以提取项目:
if (item is PickupPlaceable)
{
var loot = (PickupPlaceable)item;
loot.Pickup();
}
var loot = item as PickupPlaceable;
if (loot != null)
{
loot.Pickup();
}
当您实际运行代码时发生了什么?我认为这个问题更适合于可能值得注意的是,您在强制转换时不会丢失对象的功能;您只是失去了对功能的访问。感谢您的详细回复!关于最后两点,我得到的印象是我的设计没有使用这种方法,对吗?因为BaseGameItem类根本没有实现最初的拾取接口。即使父类不使用虚方法,也可以用虚方法“污染”父类吗?请注意,为了练习,我打算派生另一个名为“Interactiable”的类,该类也不应具有拾取功能。@AAS.N当然可以使用抽象方法,但在您的情况下,我认为您应该使用接口,例如,您可以使用pick方法的Pickable接口,然后,您想要挑选的每一项都将实现该接口,可交互也是如此。@FilipRistic是的,这正是我最初设计它的方式。这个问题源于足总
if (item is PickupPlaceable)
{
var loot = (PickupPlaceable)item;
loot.Pickup();
}
var loot = item as PickupPlaceable;
if (loot != null)
{
loot.Pickup();
}