实例化继承的对象

本文关键字:对象 继承 实例化 | 更新日期: 2023-09-27 18:36:12

继承还是相当新的,所以我需要一些帮助。目前,我有一个任务是创建一个使用继承 3 种武器的基本游戏。我的基类:

public class Weapons : MonoBehaviour
{
    public int rateOfFire;
    public string myName;
    public Weapons(string Name)
    {
        myName = Name;
    }
}

其中一个子类:

public class Rifle : Weapons
{
    public Rifle(string Name) 
        : base(Name)
    {
        myName = Name;
        rateOfFire = 5;
    }
}

的第一个问题是我是否做得对?

我的

第二个问题是如何将这些实例化到我的 Unity 场景中?我已经编写了一个切换武器的方法,这是我的播放器脚本上的数组,所以我会在这里插入一个实例化行还是创建另一个方法?缺少一些行,但这只是它:

public GameObject[] weapons;
public int currentweapon = 0;
private int invweap;
void Start()
{
    //Managing weapons
    invweap = weapons.Length;
    SwitchWeapon(currentweapon);
}
void SwitchWeapon(int index)
{
    for (int i = 0; i<invweap;i++)
    {
        if (i == index)
        {
            weapons[i].gameObject.SetActive(true);
        }
        else
        {
            weapons[i].gameObject.SetActive(false);
        }
     }
}

实例化继承的对象

的第一个问题是我是否做得对?

非常接近。让我们看看。

public class Weapons : MonoBehaviour
{

我认为这是 Unity 的一个限制,即此类型派生自给定的基本类型。通常,人们永远不会说武器是一种"单一行为",不管那是什么。

有没有不是更具体的武器? 不。 所以这应该是一个抽象类。

应命名为单数,除非类本身表示一组事物。 这应该是"武器",而不是"武器"。

abstract class Weapon: MonoBehaviour 
{

继续前进。

public int rateOfFire;

我们已经有麻烦了。公共字段是 C# 中不好的代码气味。如果你想要一个公共属性,那么把它作为一个属性:

public int RateOfFire { get; set; }

不过,更多关于鼻子:射速仅适用于远程武器。你在基类中有这个,这意味着它适用于所有武器。你不开剑。

public string myName;

再次,公共领域,不好。 使其成为属性。不要称它为myName. 称它为: Name

public string Name { get; set; }

继续前进。

public Weapons(string Name)
{
    myName = Name;
}

使用驼峰大小处理参数,使用PascalCase作为属性:

public Weapon(string name)
{
    Name = name;
}

名字会改变吗? 如果没有,请将其设为仅获取属性。

public string Name { get; }

(根据您使用的 C# 版本,这可能不合法。 如果这不起作用,请尝试{ get; private set; }

可以在 ctor 中设置名称意味着武器的每个实例都有一个名称。是吗? 这似乎不对。 有没有叫鲍勃之剑的剑,还有叫"风暴使者"的剑什么的? 我本以为该名称将与类型相关联,而不是与给定实例相关联。 我希望该名称将是一个抽象属性,由派生类型覆盖。

public abstract string Name { get; }

转到派生类型:

public Rifle(string Name) 
    : base(Name)
{
    myName = Name;
    rateOfFire = 5;
}

这搞砸了。 你已在基类构造函数中设置了名称;不要再设置了! 为什么名称由基本 ctor 设置,而射速由派生的 ctor 设置?射速应该是派生类型的属性,或者应该与名称一起传入。

让我们摆脱它们,只在派生类中重写名称和射速抽象属性。让我们改进类型层次结构,以便武器基类不包括仅远程武器通用的东西。

所以,把它们放在一起:

public abstract class Weapon : MonoBehaviour
{
  public abstract string Name { get; }
}
public abstract class RangedWeapon : Weapon
{
  public abstract int RateOfFire { get; }
}
public class Rifle : RangedWeapon
{
  public override string Name { get { return "rifle"; } }
  public override int RateOfFire { get { return 5; } }
}
public class Sword : Weapon
{
  public override string Name { get { return "sword"; } }
}

有意义?

我的

第二个问题是如何将这些实例化到我的 Unity 场景中?

最好在StackOverflow上每个问题问一个问题,因为通常发生的事情是第二个问题没有得到回答。就像我在这里没有回答一样。