私は機能的なパッケージパーサーを構築しようとしています。 specficため静的ファクトリを使用する代わりに(抽象的な静的メソッドを持たないように)
(!このクラスは抽象的ではない、編集上の注意)
public class Datagram
{
public abstract static Datagram CreateFromDatagram(Datagram datagram);
}
そして:私は今、私は単純に私はそれがこのように定義されているだろうと想像して、基本クラスDatagram
を持っていますデータグラムは、exampeとして、イーサネットと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
を作成した場合、適切なコンストラクタが追加されているという保証はありません。私はコメントの中でこれを知らせなければなりません。失敗する可能性は非常に低く、実行時には可能な限り最新の時点です。
アーキテクチャ上、またはこの問題を回避できる何らかの形のインターフェイス/継承がありますか?
あるデータグラムから別のデータグラムへの変換に制約がありますか?だから、他のデータグラムに変換することはできますか? – ckruczek
私はそう信じていませんが、それらはすべてバイト配列から構築されています(またはそれらの配列である必要があります)。その配列を解釈することで自分自身を定義します - それで、一方をもう一方に変換するには、バイト。しかし、同じ基本データを持つ新しいオブジェクトを作成するだけではなく、どのように変換するのか分かりません。再び、コンストラクターの問題が発生します。 – Joe