簡體   English   中英

如何使用將要覆蓋的通用返回類型定義靜態函數

[英]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());

使用在ClientSession內部創建的解析器實例

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM