c#多重继承

c#多重继承,c#,class,inheritance,static,C#,Class,Inheritance,Static,所以我得到了一个基类,它需要一个套接字: class Sock { public Socket s; public Sock(Socket s) { this.s = s; } public virtual void Process(byte[] data) { } ... } 然后我又上了一节课。如果接受新套接字,将创建此类的新实例: class Game : Sock { public Random Random

所以我得到了一个基类,它需要一个套接字:

class Sock
{
    public Socket s;

    public Sock(Socket s)
    {
        this.s = s;
    }

    public virtual void Process(byte[] data) { }
    ...
}
然后我又上了一节课。如果接受新套接字,将创建此类的新实例:

class Game : Sock
{
    public Random Random = new Random();

    public Timerr Timers;
    public Test Test;

    public Game(Socket s) : base(s) { }

    public static void ReceiveNewSocket(object s)
    {
        Game Client = new Game((Socket)s);
        Client.Start();
    }

    public override void Process(byte[] buf)
    {
        Timers = new Timerr(s);
        Test = new Test(s);
        Test.T();
    }
}
在Sock类中,我得到了一个虚拟函数,它被游戏类覆盖。(进程函数)在这个函数中,我从测试类(Test+Timerr类:

class Test : Game
{
    public Test(Socket s) : base(s) { }

    public void T()
    {
        Console.WriteLine(Random.Next(0, 10));
        Timers.Start();
    }
}

class Timerr : Game
{
    public Timerr(Socket s) : base(s) { }

    public void Start()
    {
        Console.WriteLine("test");
    }
}
因此,在进程函数中,我在测试中调用一个函数。在这个函数(T)中,我需要从Timerr类调用一个函数。但问题是它总是空的,尽管构造函数是在进程中调用的。例如,可以调用Random类,我想是因为它是用构造函数定义的

public Random Random = new Random();
这就是为什么其他类(没有构造函数):


在继承的类测试中总是空的。但是我在这个函数中调用其他类的其他方法是很重要的。我如何解决这个问题呢?

计时器和
测试只由
进程
方法覆盖在
游戏
上分配。你似乎没有在任何地方调用这个方法,因此
timers
Test
将始终为空。

您有
Test
,它继承自
游戏
,它有一个名为
Timers
的字段。在游戏类中,您可以作为进程方法的一部分初始化该游戏对象的计时器。但您也可以初始化一个单独的测试对象。现在,通过从Ga继承来进行测试me有自己的计时器字段,但这与创建测试的游戏中的计时器不同。这就是为什么测试中的计时器始终为空,因为该计时器从未初始化。您只在创建测试的游戏中初始化计时器。

为什么需要
Test
作为
Game
的子类拥有
null
,因为
Test
Game
Process
中创建的
对象与
Game
对象的实例不同。可能您需要的是

class Test 
{
    Game Game;
    public Test(Game g)
    {
        Game = g;
    }

    public void T()
    {
        Console.WriteLine(Random.Next(0, 10));
        Game.Timers.Start();
    }
}


然而,很难猜测您实际在做什么,也很难给您一个好的建议。

我确信这种复杂的继承有一个合理的原因,但究竟为什么您会有这么多层次的继承?这在您的解决方案中真的有意义吗?我建议您重新考虑这一点,并创建一个适当的基类(Sock)并仅从该类继承,然后在需要时使用这些类。

您遇到了麻烦,因为您的对象设计错误。使用现有类有两种选择:继承和封装。要在它们之间进行选择,您可以使用。从这些测试中选择正确的选择:

  • 袜子是插座
  • 袜子有一个插座
  • 游戏是一只袜子
  • 游戏有一只袜子

  • 你选了2和3,你应该选1和4。你其余的课也都错了。一旦你做了这些更正,你会发现这会容易得多。

    哦,我完全忘了我只能选一个大的部分课。对不起,伙计们,有时候我只是不想一些事情。

    +1我只是在写这篇文章的过程中完全一样。快告诉我:)+1我也认为合成比继承更适合这个场景。因为这更多的是对你的问题的评论,而不是回答,所以最好是发表评论。
    class Test 
    {
        Game Game;
        public Test(Game g)
        {
            Game = g;
        }
    
        public void T()
        {
            Console.WriteLine(Random.Next(0, 10));
            Game.Timers.Start();
        }
    }
    
    public override void Process(byte[] buf)
    {
        Timers = new Timerr(s);
        Test = new Test(this);
        Test.T();
    }