バイト配列にシリアル化可能なクラスを定義するインターフェイスがあります。インターフェイスとオブジェクトの逆シリアル化
public interface IByteSerializable
{
byte[] GetBytes();
}
これに自然なパートナーは、私がIByteSerializable
を実装するオブジェクトを返したいデシリアライズする方法、です。
私はこのようなインターフェイスをどのように設計するかについて悩んでいます。
これが意味をなすようには見えません。
public interface IByteSerializable
{
byte[] GetBytes();
IByteSerializable GetObject(byte[] bytes);
}
GetObject()
の実装はstatic
することはできませんし、それだけにGetObject()
メソッドを呼び出すためにダミーIByteSerializable
オブジェクトを使用しても意味がありませんのでデシリアライズする実際にはオブジェクトです。
また、これを行うには意味をなすようには見えません。
public interface IByteSerializableFactory
{
IByteSerializable GetObject(byte[] bytes);
}
ファクトリクラスは、問題を解決することができ、それは、クラスの爆発になりますように、これは感じています。また、指定されたIByteSerializable
サブクラスが直列化されてデシリアライズされる方法の詳細は、共依存であるため、2つの異なるクラスではなく、同じ場所にそれらを保持することは理にかなっています。明らかに、特定のIByteSerializable
オブジェクトを逆シリアル化するために必要な正確なプロセスは、そのオブジェクトのGetBytes()
メソッドがどのように記述されたかによってまったく異なります。
この問題を解決するために使用できる共通のデザインやパターンはありますか?
ありがとうPhil。私はあなたがここに意見を述べていることを理解していますが、私自身の学習のために、なぜ可能な場合にインターフェイスを避けることを提案していますか? – khargoosh
@khargoosh今日はインターフェイスが過度に使用されているためです。人々は何を本当に理解することなくそれらを使用しています。インタフェースは契約であり、特定のものが実装されることを約束する要求のように - 異なる開発者が複数の実装を期待していない場合には、契約を実装する必要はありません(今は依存性注入については言及していません) - インタフェース物事は過度に複雑になります。しかし、クラスはほとんど同じことを行い、デフォルトの実装(仮想メソッド)を定義する能力を与えます。 –
私はあなたがPhilと言っているものを手に入れました。あなたの助けに感謝します。この特定のケースを見ると、 'interface'は' abstract'クラスよりも理にかなっていると思いませんか? *オブジェクトが何であるかを定義するのではなく、実際にはここで動作を定義しています*。多くの異なるタイプのクラスは、 'IByteSerializable'インターフェースを実装して有効な使い方を見つけることができますが、大きく違う基本クラスのサブタイプとして定義することもできます。これはインタフェースの目的ではありませんか? – khargoosh