[英]How to define a static function with a generic return type meant to be overriden
我正在嘗試做一些令人費解的事情,它傷害了我的大腦。 因此,如果您能想到一種比我所要求的更好的方法,那么我無所不能!
本質上,我有一個ClientSession
類,該類通過tcp接受消息,並通過OnMessageReceived
事件公開它們。 我試圖告訴ClientSession
在使用MessageParser
類(作為通用參數傳遞)將其暴露在事件中之前解析消息。 我想使用靜態方法來避免實例化對象。 我還希望其他人能夠創建自己的消息解析器,以吐出他們想要的任何Type
。
本質上,我需要
ClientSession
類保證可以在實例化過程中傳遞的泛型上調用TryParse()
。 TryParse()
實現為靜態方法 像這樣
public static abstract class MessageParser<TMessage>
{
public static abstract TMessage TryParse(byte[] bytes);
}
然后其他人可以定義自己的解析器:
public static class ProtoParser : MessageParser<ProtoMessage>
{
public static ProtoMessage TryParse(byte[] bytes)
{
do some stuff...
return new ProtoMessage;
}
}
最后:
public class ClientSession<TParser>
{
public void OnMessageReceived(Object sender, MessageEventArgs e)
{
return TParser.TryParse(e.bytes);
}
{
我知道將靜態和抽象結合在一起是不可能的,但是您知道了。
我有種直覺,我正在接近這個錯誤。 提前致謝!
請參閱此處,以了解您當前的方法為何行不通且為何行不通的原因。
一些替代方案:
public abstract class MessageParser<TMessage>
{
public abstract TMessage TryParse(byte[] bytes);
}
public class ProtoParser : MessageParser<ProtoMessage>
{
public override ProtoMessage TryParse(byte[] bytes)
{
return null;
}
}
public class ClientSession<TParser, TMessage> where TParser : MessageParser<TMessage>
{
TParser _parser;
public ClientSession(TParser parser)
{
_parser = parser;
}
public TMessage OnMessageReceived(Object sender, MessageEventArgs e)
{
return _parser.TryParse(e.bytes);
}
}
並使用它:
var cs = new ClientSession<ProtoParser, ProtoMessage>(new ProtoParser());
public abstract class MessageParser<TMessage>
{
public abstract TMessage TryParse(byte[] bytes);
}
public class ProtoParser : MessageParser<ProtoMessage>
{
public override ProtoMessage TryParse(byte[] bytes)
{
return null;
}
}
public class ClientSession<TParser, TMessage> where TParser : MessageParser<TMessage>, new()
{
TParser _parser = new TParser();
public TMessage OnMessageReceived(Object sender, MessageEventArgs e)
{
return _parser.TryParse(e.bytes);
}
}
並使用它:
var cs = new ClientSession<ProtoParser, ProtoMessage>();
ClientSession
public static class ProtoParser
{
public static ProtoMessage TryParse(byte[] bytes)
{
return null;
}
}
public class ClientSession<TMessage>
{
Func<byte[], TMessage> _parser;
public ClientSession(Func<byte[], TMessage> parser)
{
_parser = parser;
}
public TMessage OnMessageReceived(Object sender, MessageEventArgs e)
{
return _parser(e.bytes);
}
}
然后使用它:
var cs = new ClientSession<ProtoMessage>(ProtoParser.TryParse);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.