Autor Beitrag
Joe1984
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 30.04.11 19:55 
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:

ausblenden 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:

ausblenden 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):

ausblenden 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
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 01.05.11 10:16 
Hallo und :welcome:

Erst einmal eine wichtige Frage, da du im Profil nicht deine Delphiversion angegeben hast:
Welche nutzt du?

Für die aktuelle Version XE ginge z.B. so etwas (ungetestet):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
uses
  Generics.Collections;

type
  TFields1 = (fPlz, fName, fAlter);
  TFields2 = (fDatum, fKundenNr, fSumme);

  TField<T> = Class(TObject)
  private
    FField: T;
  public
    procedure DoSomethingWithField;
    property Field: T read FField write FField;
  end;

  TFieldList = Class(TObjectList<TField<T>>)
  public
    constructor Create;
    destructor Destroy;
  end;
Und dann:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  NewField: TField<TFields1>;
  MyList: TObjectList<TField<TFields1>>
begin
  NewField := TField<TFields1>.Create;
  ...
  MyList := TObjectList<TField<TFields1>>.Create(True);
  MyList.Add(NewField);
  if MyList[0].Field = fName then
    ...
Joe1984 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 01.05.11 13:16 
Danke für die Antwort,

aber ich benutze Delphi 2007, so dass Generics ausscheiden.