我想为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}}
答案 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()
方法实现完成解析。