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其精萃,我调用这个函数其他类的其他方法。我怎么解决这个问题?

TimersTest仅由Process方法覆盖上Game分配。您似乎没有在任何地方调用此方法,因此TimersTest将始终为空。

您有Test,它继承自Game,它有一个名为Timers的字段。在Game类中,您将该Game对象的Timers初始化为Process方法的一部分。但是你也初始化了一个单独的测试对象。现在,继承自Game的Test有自己的Timers字段,但这与创建Test的Game中的Timers不同。这就是为什么测试中的定时器总是空的原因,因为那个定时器永远不会被初始化。您只初始化了也创建了测试的游戏中的定时器。

+0

+1我只是在写完全相同的东西。打我:) – 2010-04-27 12:44:45

为什么你需要Test作为Game的子类?您有null,因为在GameProcess中创建的对象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(); 
} 

但是这是很难猜你实际上是在做什么,给你一个很好的建议。

+0

+1我也相信组合比继承更适合这种情况。 – 2010-04-27 12:46:30

我确信这种复杂的继承有一个合理的理由,但为什么地球上你会有这么多的继承水平?你的解决方案真的有意义吗?我建议你重新考虑这一点,而是创建一个合适的基类(Sock)并从该类继承,然后在需要时使用这些类。

由于对象设计错误,您会遇到麻烦。你有两个选择来使用现有的类:继承和封装。要选择它们,您可以使用is-a and has-a test。从这些测试中挑选了正确的选择:

  1. 袜子是一个Socket
  2. 袜子有一个Socket
  3. 游戏是袜子
  4. 游戏有一个袜子

你选2和3 ,你应该选择1和4.其他班级也是错误的。一旦你做出这些更正,你会发现去更容易。

哦,我完全忘记了我只能做一个大分班。抱歉的家伙,有时我只是不考虑一些事情

+0

由于这是对您的问题的评论,而不是答案,因此最好将其作为评论。 – 2012-05-24 17:53:50