如何为继承类专门指定参数类型?

3
我希望有一个抽象类Server,其中包含一个名为Initialize的抽象方法,该方法通过引用传递IConnection。从那里开始,从这个类派生出来的类应该能够使用其Initialize实现特定化IConnection对象。这很好,但我还想有两个抽象方法: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)
{

}

有没有简单的方法来做到这一点?我已经研究了几天的范型,但在线上与我交流的人都没有能够提供解决方案。对于那些认为自己有解决方案的人,请注意:尝试使用范型实现时,很复杂,由于变异问题,它无法正常工作。

Initialize() 中的 connection 似乎是一个属性。它是否必须与 DataSent()DataReceived() 的参数 connection 区分开来? - Alex R.
它不一定需要这样,但为了方便使用,最好是这样。否则,如果你想要连接的任何状态信息,你将不得不从IConnection中进行“as”转换到更专门的类型。这个想法是摆脱像SocketAsyncEventArgs.UserToken这样的状态标记,并将整个类型特化以表示连接的状态。 - Michael J. Gray
1个回答

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
    }
}

我有些傻,我的代码中一个方差修改器被卡在一个尴尬的地方。我想当不确定时,重写一遍总是没错的!现在我感觉非常愚蠢 :) - Michael J. Gray
@MichaelJ.Gray 没关系。我写这个的时候感觉自己很蠢,因为我以为自己在问题中漏掉了什么。 - takteek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接