Autor Beitrag
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Fr 27.08.10 10:54 
Hi,

mein Problem erklärt sich am besten durch einen Code:

Folgendes ist eine abstrakte Deklaration dessen, was ich versuche mit Interfaces ebenfalls zu erreichen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TMyListItem = class
  public
    function TestFunc: Integer; abstract;
  end;

  TMyList = TObjectList<TMyListItem>
  end;


Ich erreiche damit, dass meine TMyList nur einen bestimmten Typen entgegennimmt.
Also nur Klassen, die zumindest von TMyListItem abgeleitet sind.

Ich würde das ganze aber gerne über Interfaces abbilden.
Aber Deklarationen wie Folgende:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  IMyInterface = interface
    TestFunc: Integer;
  end;

  TMyList = TObjectList<IMyInterface>
  end;


sind nicht möglich.
In meinem Verständnis und bescheiden Wahrnehmung, müsste ich ja der TObjectList die Klasse übergeben, mit der sie
arbeiten kann. Sobald ich aber eine Klasse deklariere, die das Interface enthalten muss, habe ich verloren,
weil ich dann gezwungen bin die Interface-Methoden zu implementieren.

Kennt jemand einen Ausweg aus diesem Dilemma?

Danke~

_________________
Stellen Sie sich bitte Zirkusmusik vor.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 27.08.10 11:23 
Das geht nicht, weil TObjectList eine Restriction auf dem Generic Type Parameter hat (es muss eine Klasse sein). Und zwar deswegen, weil sie sich um das Freigeben des Objekts kümmert. Das ist bei Interfaces nicht nötig, weil sich die Implementierungen selbst darum kümmern.

Versuch's mal mit
ausblenden Delphi-Quelltext
1:
TMyList = class(TList<IMyInterface>);					
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Fr 27.08.10 14:29 
Okay, ich muss die Frage nochmal neu stellen wie mir scheint, hab mich ungenau ausgedrückt.
Ich will NICHT eine Liste von Interfaces verwalten.

Ziel ist es eine Liste von Klassenobjekten zu verwalten, die ein bestimmtes Interface verwenden müssen.

Ich will das:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  IMyInterface = interface
    TestFunc: Integer;
  end;

  TMyInterfacedObj = class(TInterfacedPersistent, IMyInterface)
  public
    TestFunc: Integer;
  end;

  TMyList = TObjectList<TMyInterfacedObj>
  end;


Nur das hat den Nachteil, dass ich selbst gezwungen bin TestFunc von TMyInterfacedObj zu implementieren.
Das will ich aber garnicht.

Ich hol mal etwas weiter aus, damit der Hintergrund verständlich wird.
Wenn ich eine abstrakte Klasse definiere und ein anderer Entwickler diese ableitet und vergisst eine Methode zu implementieren,
fliegt das Programm zur Laufzeit auf die Nase. Find ich nicht prickelnd. Wenn ich Interfaces definiere werden die Entwickler gezwungen die
vorgesehenen Methoden zu Implementieren.




// Edit: Hat sich erledigt. Ich hab mal nachgesehen, ob in C# soetwas möglich ist, aber ich werde immer gezwungen sein, das Interface zu implementieren, also
bleibt nur der Ansatz über abstrakte Klassen.

Den Ansatz mit TList<IMyInterface> klappt im Übrigen. Ist ist nicht exakt das was ich wollte, aber es löst das Problem auch.
Danke für den Tipp.

_________________
Stellen Sie sich bitte Zirkusmusik vor.