Ich habe eine Schnittstelle, die eine Klasse definiert Serialisierung zu einem Byte-Array.Schnittstellen und Objekt Deserialisierung
public interface IByteSerializable
{
byte[] GetBytes();
}
Der natürliche Partner ist dies ein deserialize Methode, die ich ein Objekt zurückgeben möchten, IByteSerializable
implementiert.
Ich bin buggle mit, wie man eine solche Schnittstelle entwerfen.
scheint dies keinen Sinn zu machen:
public interface IByteSerializable
{
byte[] GetBytes();
IByteSerializable GetObject(byte[] bytes);
}
Da die Implementierung von GetObject()
nicht static
sein kann und es sinnvoll, ein Dummy IByteSerializable
Objekt zu verwenden, macht nicht nur die GetObject()
Methode aufrufen zu deserialize das tatsächliche Objekt, das ich bin.
Es scheint auch keinen Sinn zu machen, dies zu tun:
public interface IByteSerializableFactory
{
IByteSerializable GetObject(byte[] bytes);
}
Ein Factory-Klasse konnte das Problem lösen, aber das fühlt sich an wie es in der Klasse Explosion führen. Außerdem sind die Details, wie eine gegebene IByteSerializable
Unterklasse serialisiert und dann deserialisiert wird, ko-abhängig, so dass es sinnvoll ist, sie am selben Ort und nicht in zwei verschiedenen Klassen zu halten. Offensichtlich hängt der exakte Prozess, der zum Deserialisieren eines gegebenen IByteSerializable
-Objekts erforderlich ist, vollständig davon ab, wie die GetBytes()
-Methode dieses Objekts geschrieben wurde.
Gibt es ein gemeinsames Design oder Muster, das ich verwenden kann, um dieses Problem zu lösen?
Danke Phil. Ich verstehe, dass Sie hier Ihre Meinung sagen, aber für mein eigenes Lernen - warum schlagen Sie vor, Schnittstellen zu vermeiden, wenn möglich? – khargoosh
@khargoosh Einfach weil Schnittstellen heute überstrapaziert werden. Die Leute benutzen sie, ohne wirklich zu verstehen, wofür. Eine Schnittstelle ist ein Vertrag, wie eine Anfrage zu versprechen, dass bestimmte Dinge implementiert werden - es gibt keine Notwendigkeit (ich spreche nicht über Abhängigkeit Injektion jetzt), um einen Vertrag zu implementieren, wenn man nicht mehrere Implementierungen von verschiedenen Entwicklern erwartet - Schnittstellen macht das Zeug übermäßig kompliziert. Abstrakte Klassen geben jedoch die Möglichkeit, fast dasselbe zu tun und Standardimplementierungen (virtuelle Methoden) zu definieren. –
Ich bekomme, was du sagst, Phil, und danke für deine Hilfe, es ist sehr geschätzt. Wenn Sie diesen speziellen Fall betrachten, glauben Sie nicht, dass eine "Schnittstelle" mehr Sinn macht als eine "abstrakte" Klasse? Wir definieren hier wirklich das Verhalten, anstatt * zu definieren, was ein Objekt ist *. Viele verschiedene Arten von Klassen könnten eine gültige Verwendung finden, die eine IByteSerializable-Schnittstelle implementiert, aber sie könnten auch besser als Subtypen von Basisklassen definiert sein, die sich stark unterscheiden. Ist das nicht der eigentliche Zweck einer Schnittstelle? – khargoosh