2012-01-19 62 views
3

我想抽象類Server與一個抽象方法Initialize傳遞參考IConnection引用。從那裏,從這裏衍生出來的一個類應該能夠基本上專門化IConnection對象,其實現Initialize。這很好,除了我想要兩種抽象方法:DataSentDataReceived,我想在他們的簽名中使用專用類型,也許是通過泛型。我如何專門爲一個類的繼承者提供參數類型?

像這樣的東西是什麼,我想:

public override void Initialize(ref IConnection connection) 
{ 
    connection = new MySpecialConnection(connection); 
} 

public override void DataSent(MySpecialConnection connection, byte[] data) 
{ 

} 

public override void DataReceived(MySpecialConnection connection, byte[] data) 
{ 

} 

是否有一個簡單的方法來做到這一點?我一直在用泛型玩弄幾天的更好的一部分,沒有人在網上與我交談過,能夠想出一個解決方案。

對於那些認爲你會看到解決方案的人來說:當我嘗試用泛型來做這件事時,它非常複雜,並且由於差異問題,它只是不想工作正確。

+0

Initialize()中的'connection'似乎是一個屬性。它是否必須與'DataSent()'和'DataReceived()'的參數'connection'區分開來? –

+0

它不一定是,但爲了易用性,它應該是。否則,如果需要任何狀態信息,最終必須將「連接」從「連接」更改爲更專用的類型。我們的想法是遠離SocketAsyncEventArgs.UserToken之類的狀態標記,並專門化整個類型來表示連接的狀態。 –

回答

1

爲什麼不是這樣?

abstract class Server<T> where T : IConnection 
{ 
    public abstract void Initialize(ref IConnection conn); 
    public abstract void DataSent(T conn, byte[] data); 
    public abstract void DataReceived(T conn, byte[] data); 
} 

class SpecialServer : Server<SpecialConnection> 
{ 
    public override void Initialize(ref IConnection conn) 
    { 
     conn = new SpecialConnection(conn); 
    } 

    public override void DataSent(SpecialConnection conn, byte[] data) 
    { 
     //things 
    } 

    public override void DataReceived(SpecialConnection conn, byte[] data) 
    { 
     //stuff 
    } 
} 
+0

我很愚蠢,並且在我的代碼中有一個變化修飾符卡在了一個尷尬的地方。我猜如果有疑問,請再寫一遍!我現在感到非常愚蠢:) –

+0

@ MichaelJ.Gray沒關係。我覺得這很愚蠢,因爲我認爲我在這個問題上錯過了一些東西。 – takteek

相關問題