Hallo zusammen,
ein einfaches OOP Problem, ich stehe aber grad auf dem Schlauch:
Für eine Datenbankanwendung werden Listen von Datenbankfeldern angelegt, mit denen dann bestimmte Operationen durchgeführt werden können. Die einzelnen Felder (z.B. PLZ, Name, Alter) werden dabei mit einer Enumeration dargestellt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| TFields = (fPlz, fName, fAlter);
TField = Class(TObject) private FField: TFields; public procedure DoSomethingWithField; Property Field: TFields read FField write FField; End;
TFieldList = Class(TObject) private FList: TObjectList; function Get(Index: Integer): TField; public constructor Create; destructor Destroy; procedure Add(Field: TField); property Fields[Index:Integer]: TField read Get; default; End;
procedure TFieldList.Add(Field: TField); begin FList.Add(Field); end;
function TFieldList.Get(Index: Integer): TField; begin Result := TField(FList[Index]); end; |
An verschiedenen Codestellen sieht das dann so aus:
Delphi-Quelltext
1: 2: 3: 4: 5:
| AField.Field := fPLZ; AList.Add(AField); ... AField := AList[i]; AField.DoSomethingWithField; |
Soweit funktioniert das ganz gut.
Mein Problem:
Ich brauche von einer weiteren Gruppe von Datenbankfeldern wieder Listen, bei denen TField aber eben mit einer anderen Enumeration arbeiten soll (Es gibt immer nur Listen aus Feldern der ersten oder der zweiten Enumeration):
Delphi-Quelltext
1:
| TFields2 = (fDatum, fKundenNr, fSumme); |
Die Klasse TField2 soll sich also von TField nur in der verwendeten Enumeration und in den Interna von DoSomethingWithField unterscheiden.
Sollte die korrekte Lösung nicht darin liegen, für die beiden TField-Klassen eine gemeinsame Basisklasse zu schreiben, deren Nachfahre TField1 dann die erste Enumeration und Nachfahre TField2 die zweite benutzt? Wie muss diese Basisklasse aussehen, braucht diese schon ein FField, und welchen Typ sollte das Feld dann haben? Kann TFieldList dann Objekte von beiden Nachfahren speichern, oder brauche ich dann auch zwei Listenklassen?. Oder übersehe ich da eine bessere Lösung?
fragend,
Joe