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();
}