2010-04-27 201 views
0

所以香港專業教育學院有一個基類,它需要一個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其精萃,我調用這個函數其他類的其他方法。我怎麼解決這個問題?

回答

0

TimersTest僅由Process方法覆蓋上Game分配。您似乎沒有在任何地方調用此方法,因此TimersTest將始終爲空。

2

您有Test,它繼承自Game,它有一個名爲Timers的字段。在Game類中,您將該Game對象的Timers初始化爲Process方法的一部分。但是你也初始化了一個單獨的測試對象。現在,繼承自Game的Test有自己的Timers字段,但這與創建Test的Game中的Timers不同。這就是爲什麼測試中的定時器總是空的原因,因爲那個定時器永遠不會被初始化。您只初始化了也創建了測試的遊戲中的定時器。

+0

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

6

爲什麼你需要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

0

我確信這種複雜的繼承有一個合理的理由,但爲什麼地球上你會有這麼多的繼承水平?你的解決方案真的有意義嗎?我建議你重新考慮這一點,而是創建一個合適的基類(Sock)並從該類繼承,然後在需要時使用這些類。

4

由於對象設計錯誤,您會遇到麻煩。你有兩個選擇來使用現有的類:繼承和封裝。要選擇它們,您可以使用is-a and has-a test。從這些測試中挑選了正確的選擇:

  1. 襪子是一個Socket
  2. 襪子有一個Socket
  3. 遊戲是襪子
  4. 遊戲有一個襪子

你選2和3 ,你應該選擇1和4.其他班級也是錯誤的。一旦你做出這些更正,你會發現去更容易。

0

哦,我完全忘記了我只能做一個大分班。抱歉的傢伙,有時我只是不考慮一些事情

+0

由於這是對您的問題的評論,而不是答案,因此最好將其作爲評論。 – 2012-05-24 17:53:50