Datagram
,现在我天真地想象它会被定义为以下内容:
(注意:这个类不是抽象类!)
public class Datagram
{
public abstract static Datagram CreateFromDatagram(Datagram datagram);
}
然后针对特定的数据报文,以Ethernet和Tcp为例:
public class EthernetDatagram : Datagram, IPayloadDatagram
{
public override static Datagram CreateFromDatagram(Datagram datagram)
{
return new EthernetDatagram();
}
public Datagram Payload { get; }
}
public class TcpDatagram : Datagram, IPayloadDatagram
{
public overrides static Datagram CreateFromDatagram(Datagram datagram)
{
return new TcpDatagram();
}
public Datagram Payload { get; }
}
这个(不可能的)抽象静态方法的原因是我想要一个扩展方法,使我能够将所有这些数据包“链接”在一起:
public static class DatagramExtensions
{
public static T As<T>(this IPayloadDatagram datagram) where T : Datagram
{
return (T)T.CreateFromDatagram(datagram.Payload);
}
}
所以,我只需要做的就是定义一个全新的数据报类型ANewDatagram
并且定义它的工厂方法CreateFromDatagram
,接着我就可以愉快地使用这个新的功能扩展了:
SomeDatagram.As<EthernetDatagram>().As<TcpDatagram>().As<ANewDatagram>()...
而且它将是可扩展的。
鉴于我无法继承抽象类,这种方法行不通,那有没有替代的实例化通用类的好方法呢?
我可以使用反射,但这会向用户隐藏它。当我尝试创建 ANewDatagram
时,我必须记住稍后要反射一个 CreateFromDatagram
方法。
目前,我正在使用反射来获取构造函数,但我无法强制执行特定构造函数接受有效负载。如果有人创建新的 Datagram
,他们不能保证添加正确的构造函数,我必须在注释中告诉他们,但很可能会被忽略,故障点最迟在运行时发生。
在架构上或通过某种形式的接口/继承是否有更好的替代方案可以解决这个问题?
(如果有人想查看我正在使用的完整源代码,我正在试图作为 https://github.com/PcapDotNet/Pcap.Net 的一部分添加这些扩展的数据包解释库,尽量少地修改它)