c#在抽象类中返回派生类

本文关键字:派生 返回 抽象类 | 更新日期: 2023-09-27 18:03:00

我想为GPGGA, GPGSV等创建一个NMEA消息解析器。每个消息都派生自抽象类NMEAMsg。

所以我需要为每个消息类型覆盖parseToken:

但是,我不知道如何在抽象类中返回派生类?

我得到Invalid CastException unhandled by user当运行这个代码

我需要public static NMEAMsg parse(string src)方法来返回GGAGSA等派生类

//NMEAMsg.cs
public abstract class NMEAMsg
{
    public static NMEAMsg parse(string src)
    {
        NMEAMsg nmeaMsg = (NMEAMsg)new object();
        var tokens = src.Split(',');
        tokens[tokens.Length - 1] = tokens[tokens.Length - 1].Split('*')[0];
        nmeaMsg.parseTokens(tokens);
        return nmeaMsg;
    }
    public abstract void parseTokens(string[] tokens);
}

//GGA.cs
public class GGA : NMEAMsg
{
    public double latitude;
    public double longitude;
    public override void parseTokens(string[] tokens)
    {
        Double.TryParse(tokens[1], out this.latitude);
        Double.TryParse(tokens[2], out this.longitude);
    }
}
//GSA.cs
public class GSA : NMEAMsg
{
    public double hdop;
    public override void parseTokens(string[] tokens)
    {
        Double.TryParse(tokens[1], out this.hdop);
    }
}
//main.cs
string src = "$GPGGA,123,323*23";
var data = NMEAMsg.parse(src);
if (data is GGA) {
   //Do stuff here  
} else if (data is GSA) {
   //Do stuff here
}

c#在抽象类中返回派生类

您可能需要这样的东西:

public static NMEAMsg parse(string src)
{
    var tokens = src.Split(',');
    tokens[tokens.Length - 1] = tokens[tokens.Length - 1].Split('*')[0];
    NMEAMsg nmeaMsg = null;
    if (tokens[0] == "$GPGGA")
    {
        nmeaMsg = new GGA();
    }
    else if (tokens[0] == "$GPGSA")
    {
        nmeaMsg = new GSA();
    }
    else
    {
        throw new Exception("Unrecognized type: " + tokens[0]);
    }
    nmeaMsg.parseTokens(tokens);
    return nmeaMsg;
}

根据已解析字符串的开头实例化正确的类,然后调用特定类的parseTokens()方法实现来完成解析。