2012-01-19 11 views
3

参照としてIConnectionへの参照を渡すInitializeという抽象メソッドを持つ抽象クラスServerが必要です。そこから、このクラスから派生したクラスは、のオブジェクトを本質的に特殊化することができるはずです(Initialize)。これは、2つの抽象メソッド(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

必ずしもそうである必要はありませんが、使いやすいようにする必要があります。それ以外の場合は、状態情報のいずれかが必要な場合は、IConnectionをより特殊なタイプにキャストアウトする必要があります。この考え方は、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

関連する問題