【问题标题】:Cannot Access Class Field When Inheriting继承时无法访问类字段
【发布时间】:2020-07-19 06:54:55
【问题描述】:

我正在开发一款游戏,但在访问我的任务系统的类字段时遇到问题。在这个系统中,任务可以有多个目标,目标可以是不同的类型。所以在这个例子中,我有一个名为“Ultimate Fetch”的获取任务,有两个获取目标,每个获取目标都与一个项目 ID 相关联。我无法访问商品 ID。

任务类如下所示:

public class Quest
{
    public List<Goal> goals { get; set; } = new List<Goal>();
    public string QuestName { get; set; }
    public string description { get; set; }
    public int XpReward { get; set; }
    public bool completed { get; set; }
}

目标类如下所示:

public class Goal
{
    public Quest Quest { get; set; }
    public string description { get; set; }
    public bool completed { get; set; }
    public int currentAmount { get; set; }
    public int requiredAmount { get; set; }

}

FetchGoal 类如下所示:

public class FetchGoal : Goal
{
    public int itemId { get; set; } //<-- I'm having issues accessing this

    public FetchGoal(Quest quest, int _itemId, string _description, bool _completed, int _currentAmount, int _requiredAmount)
    {
        this.Quest = quest;
        this.itemId = _itemId;
        this.completed = _completed;
        this.description = _description;
        this.currentAmount = _currentAmount;
        this.requiredAmount = _requiredAmount;
    }

}

Fetch Quest 类如下所示:

public class UltimateFetchQuest : Quest
{
    public UltimateFetchQuest()
    {
        QuestName = "Ultimate Fetch";
        description = "Fetch Stuff!!";
        XpReward = 100;
        goals.Add(new FetchGoal(this, 0, "Fetch 5 things", false, 0, 2));
        goals.Add(new FetchGoal(this, 1, "Fetch 2 widgets", false, 0, 2));
    }
}

为了简单起见,我只有一个按钮来尝试访问该字段,如下所示:

    UltimateFetchQuest FetchQuest = new UltimateFetchQuest();

    private void button1_Click(object sender, EventArgs e)
    {
        List<Goal> lstGoals = FetchQuest.goals;
        int intItemId = lstGoals[0].itemId; // <-- This does not work
    }

按钮点击事件的第二行无效。我认为这是因为我正在访问目标列表,而不是 fetchgoals。让我困惑的部分是当我调试程序时,我可以使用智能感知看到该字段:

似乎有访问它的路径,但正如您在此处看到的,我不能:

感谢任何帮助!

【问题讨论】:

  • 提示:如果lstGoals 包含不是 FetchQuest 的内容,你期望会发生什么?你说过“这是一个目标列表——任何类型的目标都可以。” FetchQuest 只是 一种 目标 - 其他人可能没有 itemId 属性。
  • 嗯,这很好。我想这是有道理的。
  • 调试时,Goal 显示为其最具体的类型:FetchGoal。在button1_Click 中,您以Goal 的身份访问每个项目,这就是您无法访问itemId 的原因。

标签: c# class inheritance


【解决方案1】:

你可以使用模式匹配

if(lstGoals[0] is Fetchgoal fetchgoal)
{
    var id = fetchgoal.itemId;
}

更好的是使用开关,因为你有多个目标,正如你所说的

switch(lstGoals[0])
{
    case Fetchgoal fetchgoal:
     // stuff
     break;

    case OtherGoal othergoal:
     // stuff
    break;
}

【讨论】:

  • 旁注:我们称lstGoals[0] is Fetchgoal fetchgoal 和类似的构造模式匹配
  • 据我所知,switch 语句非常适合我正在做的事情。希望一直这样哈哈。谢谢。
猜你喜欢
  • 2014-01-09
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 2022-10-05
  • 2016-07-03
  • 1970-01-01
相关资源
最近更新 更多