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#:
C#-Quelltext
1: 2: 3: 4:
| List<MyItem> list = new List<MyItem>(); list.Add(new MyItem()); MyItem myItem = list[0]; |
Chrome:
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
), 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:
C#-Quelltext
1: 2: 3: 4:
| public int Add(MyItem value) { return InnerList.Add(value); } |
Ilist.Add, welches dein Add aufruft.
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]:
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; default; virtual;
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.