【问题标题】:Exception of type 'System.StackOverflowException' was thrown by WorldServer classWorldServer 类引发了“System.StackOverflowException”类型的异常
【发布时间】:2018-01-28 20:58:19
【问题描述】:

这是我的代码WorldServer.cs

public class JsonData
{
    public string header;
    public Dictionary<string, string> data = new Dictionary<string, string>();
    public int connectionId;
}

namespace Server
{
    public class WorldServer
    {
        private Character character = new Character();

        void Test()
        {
            character.UpdateCharacterState();
        }

        public void Broadcast()
        {
            Console.WriteLine("We in Broadcast");
        }
    }
}

这是我的Character.cs

public class Character : WorldServer
{
    public void UpdateCharacterState()
    {
        Console.WriteLine("State:");
        Broadcast();
    }
}

当我尝试运行我的代码时,我收到以下错误:

引发了“System.StackOverflowException”类型的异常。

我有一个基类WorldServer 和一个扩展它的Character。我必须从WorldServer 类调用UpdateCharacterState 方法,并从Character 类调用Broadcast 方法,该方法在WorldServer 类中声明。有可能吗?怎么做? 你能告诉我我的错误在哪里,我该如何解决?

【问题讨论】:

  • 每次构造一个Character的实例,它继承自WorldServer,你又构造了另一个Character,它继承自WorldServer,所以需要构造一个Character,继承自……你看到了吗?
  • 我明白你的意思,但我对C# 很陌生。你能回答我如何制作这个结构吗?
  • 对不起,我不完全明白你想要完成什么,所以我无法实现它。
  • 为什么角色要从世界服务器继承?
  • 古斯曼在这里提出了最好的问题:为什么角色会从世界服务器继承?这就像让狮子继承家具。当然有可能,但是当您只阅读类名时,它没有多大意义,不是吗?当一个类继承另一个类时,这意味着它是一种更具体的基类——桌子继承家具,狮子继承动物。角色如何是一种世界服务器?

标签: c#


【解决方案1】:

好的,所以这会起作用....但是它不是很好的 OOP,但是当您学习如何编码时,我将把它留给您的旅程(以及未来的问题)。

无论如何...

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var server = new WorldServer();

            server.Test();
        }
    }

    public class JsonData
    {
        public string header;
        public Dictionary<string, string> data = new Dictionary<string, string>();
        public int connectionId;
    }


    public class WorldServer
    {
        private Character character = new Character();

        public void Test() {
            character.UpdateCharacterState(this);
        }

        public void Broadcast(){
            Console.WriteLine("We in Broadcast");
        }
    }



    public class Character 
    {
        public void UpdateCharacterState(WorldServer server)
        {
            Console.WriteLine("State:");

            server.Broadcast();
        }
    }
}

我认为你的收获是研究类与实例以及这实际上意味着什么。我给出的修改后的代码向您介绍了一个新概念(可能),称为“依赖注入”,它是引用其他对象类型的好方法......尽量限制您对继承的使用。

祝你好运,继续学习!

【讨论】:

  • 你就是男人!我只需要看到并得到这个想法就是这条线public void UpdateCharacterState(WorldServer server)。我通过将 worldserver 和 character 放入两个不同的名称空间来改变我的方法。再次感谢您。
  • 你能给我任何好的链接,我可以在其中研究更多关于这些类与实例的信息吗?
  • 要成为一名优秀的程序员,您需要研究自己的东西(我每天都这样做,我从 15 岁开始,现在 41 岁)。我很乐意通过您发布的示例为您提供帮助,但不自己搜索有点懒惰....无论如何,就这一次 :) quora.com/…
  • 知道了!再一次感谢你。因此,如果我对此character.UpdateCharacterState(this) 理解正确,我基本上将WorldServer 的实例发送到Character 类调用UpdateCharacterState,并且该实例是UpdateCharacterState 方法的第一个参数。正确吗?
  • 你去吧,伙计:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多