为什么我的 QuestGUI 中的 Player 属性返回 null,尽管在 Game 构造函数中进行了初始化?

问题描述 投票:0回答:1

我正在用 C# 实现一个基于文本的游戏。 在“游戏”类中,我正在初始化一个播放器。如果玩家完成了任务,他将会获得一些奖励。因此,我想将初始化的播放器交给另一个名为 QuestGUI 的类。

游戏类的构造函数:

        public Game()
        {
            Item[] initialItems = new Item[]
            {
                new Weapon("Sword", 10),
            };
            main_player = new Player("Omegar", 100, initialItems);

            Quest[] quests = new Quest[]
            {
                new Quest(...);
            };

            QuestHub QuestHub = new QuestHub(quests);
            QuestGUI = new QuestGUI(QuestHub);
            QuestHubGUI = new QuestHubGUI(QuestHub);

            QuestGUI.Player = main_player;
        }

这是我想在 QuestGUI 类中执行的操作:

                QuestHub.DisplayResult(quest, input);

                Item reward = Player.GenerateItem();
                Player.AddItem(reward);
                Player.ReceiveItemMessage(reward);

QuestGUI 类的构造函数:

        public Player Player { get; set; }
        public QuestHub QuestHub { get; set; }

        public QuestGUI(QuestHub questHub)
        {
            QuestHub = questHub;
        }

我尝试运行上面描述的内容。我希望程序首先显示任务结果,然后为玩家提供生成的项目。相反,我得到了以下异常:

System.NullReferenceException:“未将对象引用设置为对象的实例。”

lb426_test.QuestGUI.Player.get 返回 null。

c# constructor initialization text-based
1个回答
0
投票

您在

main_player
类中声明了
Game
。在
QuestGUI
类中,您声明了属性
Player
,该属性未在
QuestGUI
的构造函数中初始化。您必须将播放器添加为构造函数参数并初始化它。

    public Player Player { get; set; }
    public QuestHub QuestHub { get; set; }

    public QuestGUI(QuestHub questHub, Player player)
    {
        QuestHub = questHub;
        Player = player;
    }

那么需要将

Game
类中的构造函数调整为

    public Game()
    {
        Item[] initialItems = new Item[]
        {
            new Weapon("Sword", 10),
        };
        main_player = new Player("Omegar", 100, initialItems);

        Quest[] quests = new Quest[]
        {
            new Quest(...);
        };

        QuestHub QuestHub = new QuestHub(quests);
        QuestGUI = new QuestGUI(QuestHub);
        QuestHubGUI = new QuestHubGUI(QuestHub);

        QuestGUI.Player = main_player;
    }
© www.soinside.com 2019 - 2024. All rights reserved.