@akurka
Im
OOP-Geschäft muss man etwas abstrakter denken (damit das auch Sinn macht und das Leben vereinfacht).
z.B. Die Komponente für den
Com-Port sorgt für den Datenaustausch (Protokoll) und nicht mehr.
Sie weiß, wie groß die Pakete sind (ist Bestandteil des Protokolls) und übergibt diese Pakete an eine weitere Instanz, die weiß, wie man aus diesen Paketen (eine Handvoll Bytes) sinnvolle Strukturen erzeugt.
Etwas Ähnliches (mit Klassen) gibt es hier
http://www.delphipraxis.net/180297-b...iebereien.html
Delphi-Quellcode:
unit BaseDataFactory;
interface
uses
System.Generics.Collections,
System.Classes,
System.SysUtils,
BaseData;
type
TBaseDataClass =
class of TBaseData;
TBaseDataFactory =
class
private
class var _Types : TDictionary<Byte, TBaseDataClass>;
protected
class constructor Create;
class destructor Destroy;
public
class function CreateFromStream( AStream : TStream ) : TBaseData;
class procedure RegisterType( AType : Byte; AClass : TBaseDataClass );
end;
implementation
{ TBaseDataFactory }
class constructor TBaseDataFactory.Create;
begin
_Types := TDictionary<Byte, TBaseDataClass>.Create;
end;
class function TBaseDataFactory.CreateFromStream( AStream : TStream ) : TBaseData;
var
LType : Byte;
LSize : Byte;
LData : TBytes;
LClass : TBaseDataClass;
begin
AStream.
Read( LType, SizeOf( LType ) );
AStream.
Read( LSize, SizeOf( LSize ) );
SetLength( LData, LSize );
AStream.
Read( LData, LSize );
LClass := _Types[LType];
// Bei einem unbekannten Typen wird hier eine Exception geworfen
Result := LClass.Create( LData );
end;
class destructor TBaseDataFactory.Destroy;
begin
_Types.Free;
end;
class procedure TBaseDataFactory.RegisterType( AType : Byte; AClass : TBaseDataClass );
begin
_Types.AddOrSetValue( AType, AClass );
end;
end.
In die andere Richtung geht es genauso (nur umgekehrt).
Einer weiß, wie man aus einer Informationsstruktur (z.B. ein Record) eine Byte-Folge machen kann, übergibt diese Byte-Folge an jemand anderes, der Byte-Folgen versenden kann, der wiederum weiß, dass das über den
Com-Port erfolgen muss.