C#多继承
所以香港专业教育学院有一个基类,它需要一个Socket:C#多继承
class Sock
{
public Socket s;
public Sock(Socket s)
{
this.s = s;
}
public virtual void Process(byte[] data) { }
...
}
那么Ive得到了另一个类。如果一个新的socket被接受这一类的新实例将被创建:
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();
}
}
在袜类香港专业教育学院
得到了得到由游戏类覆盖一个虚函数(处理功能)在此功能即时调用。从测试类(测试+ 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");
}
}
所以在处理功能的IM调用测试的函数,在此函数(T),我需要从Timerr Class.But调用一个函数的问题。它始终为NULL,虽然构造函数在Process中被调用,例如Random Class可以被调用,我猜它是因为它的构造函数定义的。
public Random Random = new Random();
而这就是为什么其他类(无构造函数):
public Timerr Timers;
public Test Test;
总是在继承的类空Test.But其精萃,我调用这个函数其他类的其他方法。我怎么解决这个问题?
Timers
和Test
仅由Process
方法覆盖上Game
分配。您似乎没有在任何地方调用此方法,因此Timers
和Test
将始终为空。
您有Test
,它继承自Game
,它有一个名为Timers
的字段。在Game类中,您将该Game对象的Timers初始化为Process方法的一部分。但是你也初始化了一个单独的测试对象。现在,继承自Game的Test有自己的Timers字段,但这与创建Test的Game中的Timers不同。这就是为什么测试中的定时器总是空的原因,因为那个定时器永远不会被初始化。您只初始化了也创建了测试的游戏中的定时器。
为什么你需要Test
作为Game
的子类?您有null
,因为在Game
的Process
中创建的对象Test
是与Game
对象不同的实例。也许你需要的是
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();
}
但是这是很难猜你实际上是在做什么,给你一个很好的建议。
+1我也相信组合比继承更适合这种情况。 – 2010-04-27 12:46:30
我确信这种复杂的继承有一个合理的理由,但为什么地球上你会有这么多的继承水平?你的解决方案真的有意义吗?我建议你重新考虑这一点,而是创建一个合适的基类(Sock)并从该类继承,然后在需要时使用这些类。
由于对象设计错误,您会遇到麻烦。你有两个选择来使用现有的类:继承和封装。要选择它们,您可以使用is-a and has-a test。从这些测试中挑选了正确的选择:
- 袜子是一个Socket
- 袜子有一个Socket
- 游戏是袜子
- 游戏有一个袜子
你选2和3 ,你应该选择1和4.其他班级也是错误的。一旦你做出这些更正,你会发现去更容易。
哦,我完全忘记了我只能做一个大分班。抱歉的家伙,有时我只是不考虑一些事情
由于这是对您的问题的评论,而不是答案,因此最好将其作为评论。 – 2012-05-24 17:53:50
+1我只是在写完全相同的东西。打我:) – 2010-04-27 12:44:45