Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在调用继承的方法之前向上转换吗_C#_Unity3d - Fatal编程技术网

C# 我应该在调用继承的方法之前向上转换吗

C# 我应该在调用继承的方法之前向上转换吗,c#,unity3d,C#,Unity3d,我可能在这里做了一些错误的事情,但是我有一个基类和多个派生类 public abstract class BaseItem : MonoBehaviour { public void LevelUp() { // do some common thing ... maybe increase damage } } 在inventory manager中,我有一个所有项目的列表,可以对它们调用LevelUp方

我可能在这里做了一些错误的事情,但是我有一个基类和多个派生类

 public abstract class BaseItem : MonoBehaviour
    {
        public void LevelUp()
        {
           // do some common thing ... maybe increase damage
        }
    }
在inventory manager中,我有一个所有项目的列表,可以对它们调用
LevelUp
方法。我认为问题在于,我有一个
的列表,而特定的类
LevelUp
没有被调用:

public void LevelUpItem(string itemName)
        {
            var item = AvailableItems.First(w => w.ItemName.Equals(itemName));
            
            item.LevelUp();
        }
我最初的想法是,我需要在调用LevelUp函数之前向上投射该项。我的第二个想法是我在这里做错了什么

<>我的具体问题是“如何安全地上移”,我的问题是:“我应该考虑一种不同的多态性方法吗?”

< P> > C中,你可以使用关键字(也有修改器,如果你不想有任何默认实现)的话:

并使用修改器更改继承器中的行为:

public class RangedWeapon: BaseItem 
{
  public override void LevelUp()
    {
        base.LevelUp();
        // do specific things here... maybe increase range.
    }
}

为什么不将基本方法标记为
virtual
override
子方法(这是通常的方法)?我有点新。。。虚拟机是否允许默认实现?我明白了。。。我显然还不知道虚方法和非虚方法之间的区别。是的,虚方法只是更改派生类型的访问。在基础上设置公共虚拟void,在派生类型上设置公共重写void。Base仍然可以使用默认实现。谢谢Yall!有人回答我,我就接受。
public void LevelUpItem(string itemName)
        {
            var item = AvailableItems.First(w => w.ItemName.Equals(itemName));
            
            item.LevelUp();
        }
public abstract class BaseItem : MonoBehaviour
{
    public virtual void LevelUp()
    {
       // do some common thing ... maybe increase damage
    }
}
public class RangedWeapon: BaseItem 
{
  public override void LevelUp()
    {
        base.LevelUp();
        // do specific things here... maybe increase range.
    }
}