Autor Beitrag
Master_BB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: Sa 22.10.05 14:50 
Hallo,
weiß jemand wie ich eine Liste erstellte
die von ArrayList abgeleitet ist wo jedoch
die Items der ArrayList einen vordefinierten Typ haben?

sprich

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  TMyList = class(System.Collections.ArrayList)
  public
  end;
  TMyItem = class
  public
  end;

//jetzt soll sowas möglich sein
var
  AMyList : TMyList;
  AMyItem : TMyItem;
begin
  AMyItem := AMyList.Item[0];  //normaler weise bräuche man hier ja einen Typcast
end;


greetz
Master_BB


Moderiert von user profile iconChristian S.: Topic aus .NET verschoben am Sa 22.10.2005 um 14:51
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Sa 22.10.05 17:13 
Dzu willst eigentlich gar nicht von ArrayList ableiten, right?
Du willst eigentlich nur eine typisierte Implementierung von IList. ;)

Mit .Net2 ist das ein no-brainer:
C#:
ausblenden C#-Quelltext
1:
2:
3:
4:
List<MyItem> list = new List<MyItem>();
list.Add(new MyItem());
      
MyItem myItem = list[0];

Chrome:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var list = new List<MyItem>();
list.Add(new MyItem());
      
var myItem = list[0];


Wenn du es in 1.1 haben willst (Kunststück mit D.Net :mrgreen: ), wäre hier der typed Collection Wizzard aus #d eine Hilfe.
Willst du es in D.Net machen wirst du bemerken, dass du dort Interfaces nicht mehr explizit implementieren kannst.[meta]trotz der Abwärtskompat., die dir ständig das Bein stellt ist es hier inkompatibel[/meta]

In C# implmentiert man ein Interface explizit[meta]somit werden die Interface member nur zugänglich, wenn man die Instanz darauf castet[/meta], indem man den Interface Namen varanstellt und keinen Access modifier angibt.
Am Beispiel IList.Add würde das so aussehen:

typisiertes Add:
ausblenden C#-Quelltext
1:
2:
3:
4:
public int Add(MyItem value)
{
  return InnerList.Add(value);
}


Ilist.Add, welches dein Add aufruft.
ausblenden C#-Quelltext
1:
2:
3:
4:
int IList.Add(object value)
{
  return Add(value as MyItem);
}


Mit der guten alten implements-Clause würde es so aussehen[meta]ist nicht direkt Delphi, aber Chrome Code, der möglichst "urtümlich" aussieht[/meta]:
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:
MyItemCollection = public class(IList)
private
  fInnerList: ArrayList; readonly;
  
  method set_Item(index : Integer; value: MyItem);
  method get_Item(index : Integer): MyItem;
protected
  property InnerList : IList read fInnerList; implements IList;
public
  constructor;
  constructor(capacity : Integer);
  
  property Count : Integer read fInnerList.Count;
  
  property IsFixedSize    : Boolean read fInnerList.IsFixedSize;
  property IsReadonly     : Boolean read fInnerList.IsReadonly;
  property IsSynchronized : Boolean read fInnerList.IsSynchronized;
  
  property Item[index : Integer] : MyItem
    read get_Item write set_Item; defaultvirtual;

  method Add(value : MyItem) : Integer; virtual;
  method Remove(value : MyItem); virtual;
  method Contains(value : MyItem) : Boolean; virtual;
  method IndexOf(value : MyItem) : Integer; virtual;
  method Insert(index : Integer; value : MyItem); virtual;
end;


Unter D.Net wird es dir wohl nicht erspart bleiben alles zu Fuss zu machen.
Alle Methoden und den Indexer musst du außerdem mit reintroduce; versehen, damit sie nicht mehr in der Code completion auftauchen[meta]falls du *wirklich* von ArrayList ableiten willst...[/meta].

btw, Danke: beim Tippen des Beitrages sind mir 3 Ideen gekommen, mit denen ich die Jungs von RemObjects nerven kann. :mrgreen:
Master_BB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: Sa 22.10.05 19:02 
hm schade,
ich hatte mir schon fast gedacht das ich über die IList
implementation gehen muss.

ich hatte gehofft da gibts in .NET1.1 sowas
schönes wie man bei dem XML unter .NET1.1 machen kann.

und zwar setzt man dort ja vor eine Liste das Attribut

ausblenden Delphi-Quelltext
1:
2:
3:
[XMLInclude(TypeOf(MyItem))]
TMyList = class(ArrayList)
....



und schupp weiß der Serializer von welchem Typ die Items
sind. Und ich dachte es gibt davon vieleicht noch eine allgemeinere
Form die mir alle Items der ArrayList schon beim Implementieren
usw in diesen Typ gibt.
Naja schade. Bis Delphi .NEt2.0 fähig wird
wirds noch dauern ergo bleib ich beim Typecasten

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Sa 22.10.05 19:16 
user profile iconMaster_BB hat folgendes geschrieben:
hm schade,
ich hatte mir schon fast gedacht das ich über die IList
implementation gehen muss.
IList bring IEnumerable mit und damit hast du schon einmal simples DataBinding für Listen-Controls und foreach/for-in frei Haus.
Zitat:
Naja schade. Bis Delphi .NEt2.0 fähig wird
wirds noch dauern ergo bleib ich beim Typecasten
Oder einfach der typed collection Wizzard aus #d. Was bringt einem das "Verständnis" zwischen .Net-Sprachen, wenn man es nicht benutzt? Eine C# Assembly mit der typed Collection aus #d und die einfach in deinem D.Net-Programm verwenden. ;)
Kommst du später zu .Net2.0 würdest du einfach so deinen Code zum laufen bringen[meta]um die ganzen unnötigen Typecasts wegzukriegen[/meta]:
ausblenden Delphi-Quelltext
1:
2:
3:
type 
  MyItemCollection = public class(List<MyItem>)
  end;



btw: Gibt es eigentlich einen Grund für D.Net[meta]außer Portierung über VCL.Net...[/meta]? Also nicht nur weil "Delphi" draufsteht. ;)
Master_BB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: So 23.10.05 11:24 
die firma für die ich frei mit arbeite schreibt ihre gesamte
software in delphi. ergo ist delphi die sprache mit der
ich zu programmieren habe,
ich programmiere muss ich auch sagen sehr gerne delphi.