C#返回抽象类中的派生类

时间:2015-07-16 02:16:44

标签: c#

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

所以我需要为每种消息类型覆盖Invalid CastException unhandled by user

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

我在运行此代码时获得public static NMEAMsg parse(string src)

我需要GGA方法来返回类似GSA//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 } 的派生类

{{1}}

1 个答案:

答案 0 :(得分:2)

你可能需要这样的东西:

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()方法实现完成解析。