C#:函数返回类型是否覆盖对象转换?

时间:2017-09-25 15:59:27

标签: c# inheritance unity3d interface polymorphism

我不确定用什么技术术语来描述这种情况,所以这是我的情况。

  

上下文

我正在为游戏设计一个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);
    });
}

我的问题如下:

  1. 为了知道我应该返回哪个类或该项正在实现什么接口,我在数据库中包含一个布尔值,用于检查它是否是一个Pickup对象。这是明智的决定吗?如果您可以指导我在这种情况下使用的文章或设计模式,我将非常感激。
  2. 然而,我主要担心的是返回类型。我正在使用out关键字并输出BaseGameItem对象。但是,在我的三元条件下,我可以将其初始化为派生的Pickup项目。函数输出会将其转换为BaseGameItem,因此会丢失所有的Pickup功能吗?或者它是否将任何派生类解释为有效的返回类型?
  3. 如果对象以BaseGameItem的形式返回,那么接收者是否应该知道他们必须将它强制转换为派生类?如何解决问题,我只是返回一个布尔值,表明它是初始化函数中的拾取器,以便接收器知道何时适当地转换?

1 个答案:

答案 0 :(得分:0)

  1.   

    为了知道我应该返回哪个类或项目正在实现什么接口,我在数据库中包含了一个布尔值,用于检查它是否是一个Pickup对象。这是明智的决定吗?如果您可以指导我在这种情况下使用的文章或设计模式,我将非常感激。

  2. 您与factory method

    走在正确的轨道上
    1.   

      然而,我主要担心的是返回类型。我正在使用out关键字并输出BaseGameItem对象。但是,在我的三元条件下,我可以将其初始化为派生的Pickup项目。函数输出会将其转换为BaseGameItem,因此会丢失所有的Pickup功能吗?或者它是否将任何派生类解释为有效的返回类型?

    2. 返回类型不会丢失向上转换的功能:

        

      基类可以定义和实现虚方法,派生类可以覆盖它们,这意味着它们提供了自己的定义和实现。在运行时,当客户端代码调用该方法时,CLR会查找该对象的运行时类型,并调用该方法的覆盖。因此,在源代码中,您可以在基类上调用方法,并导致派生类的方法版本被执行。

      - Polymorphism (C# Programming Guide)

      1.   

        如果对象以BaseGameItem的形式返回,那么接收者是否应该知道他们必须将它转换为派生类?如何解决问题,我只是返回一个布尔值,表明它在初始化函数中是一个拾取器,以便接收器知道何时适当地转换?

      2. 不,"因此,在源代码中,您可以在基类上调用方法,并导致派生类的方法版本被执行。"但是,如果您需要派生类中的特定功能,例如PickupPlaceable.Pickup(),则必须先将其向下转发

        编辑:

          

        问题变成了,接收者如何知道是否应该投射基础项目。

        您始终可以使用isas关键字检查是否可以选择某个项目:

        if (item is PickupPlaceable)
        {
             var loot = (PickupPlaceable)item;
             loot.Pickup();
        }
        
        var loot = item as PickupPlaceable;
        if (loot != null)
        {
             loot.Pickup();
        }