Para criar CollectionBase usamos o seguinte código:


Namespace System.Collections

A declaração pode ser feita da seguinte forma:


CollectionBase = class (System.Object, IList, ICollection, IEnumerable); abstract;

Assim, provemos a classe básica abstrata para uma coleção fortemente tipada.

Exemplo

O exemplo a seguir implementa o CollectionBase classificando e usando implementação para criar uma coleção de objetos de Int16:


Program System_Collections_CollectionBase; 
              
 uses System.Collections;
  
 type
   Int16Collection = class(CollectionBase)
 public
     function get_Item(index: Integer): Int16;
     procedure set_Item(index: Integer; const Value: Int16);
     function Add(value: Int16): Integer;
     function IndexOf(value: Int16): Integer;
     procedure Insert(index: Integer; value: Int16);
     procedure Remove(value: Int16);
     function Contains(value: Int16): Boolean;
  
     property Item[index: Integer]: Int16
              read get_Item
              write set_Item;
              default;
   strict protected
     procedure OnInsert(index: Integer;
       value: System.Object); override;
     procedure OnRemove(index: Integer;
       value: System.Object); override;
     procedure OnSet(index: Integer;
       oldValue: System.Object;
       newValue: System.Object); override;
     procedure OnValidate(value: System.Object); override;
   end;
  
   SamplesCollectionBase = class
   public
     class procedure Main;
   private
     class procedure PrintIndexAndValues (
       myCol: Int16Collection);
   end;
  
  
 { SamplesCollectionBase }
  
 class procedure SamplesCollectionBase.Main;
 var
   i: Integer;
   myI16: Int16Collection;
 begin
   // Creates and initializes a new CollectionBase
   myI16 := Int16Collection.Create;
   myI16.Add(Int16(1));
   myI16.Add(Int16(2));
   myI16.Add(Int16(3));
   myI16.Add(Int16(5));
   myI16.Add(Int16(7));
  
   // Displays the contents of the 
   //collection using the enumerator
   Console.WriteLine('Initial contents of the collection:');
   PrintIndexAndValues(myI16);
  
   // Searches the collection with Contains and IndexOf
   Console.WriteLine('Contains 3: {0}', 
     myI16.Contains(3));
   Console.WriteLine('2 is at index {0}.', 
     myI16.IndexOf(2));
   Console.WriteLine;
  
   // Inserts an element into the collection at index 3
   myI16.Insert(3, (Int16(13)));
   Console.WriteLine('Contents of the collection 
     after inserting at index 3:');
   PrintIndexAndValues(myI16);
  
   // Gets and sets an element using the index.
   myI16[4] := 123;
   Console.WriteLine('Contents of the collection after setting the element at index 4 to 123:');
   PrintIndexAndValues(myI16);
  
   // Removes an element from the collection
   myI16.Remove((Int16(2)));
  
   // Displays the contents of 
   //the collection using the index.
   Console.WriteLine('Contents of the collection after removing the element 2:');
   i := 0;
   while (i < myI16.Count) do
   begin
     Console.WriteLine('[{0}]:   {1}', i, myI16[i]);
     i := i + 1;
   end;
 end;
  
 class procedure SamplesCollectionBase.PrintIndexAndValues (
   myCol: Int16Collection);
 var
   myEnumerator: System.Collections.IEnumerator;
   i: Integer;
 begin
   i := 0;
   myEnumerator := myCol.GetEnumerator;
   while myEnumerator.MoveNext do
   begin
     Console.WriteLine('[{0}]:   {1}', 
       i, myEnumerator.Current);
     i:=i+1;
   end;
   Console.WriteLine;
 end;
  
 { Int16Collection }
  
 function Int16Collection.Add(value: Int16): Integer;
 begin
   Result := List.Add(value);
 end;
  
 function Int16Collection.Contains(value: Int16): Boolean;
 begin
   // If value is not of type Int16, this will return false.
   Result := List.Contains(value);
 end;
  
 function Int16Collection.get_Item(index: Integer): Int16;
 begin
   Result := (Int16(List[index]));
 end;
  
 function Int16Collection.IndexOf(value: Int16): Integer;
 begin
   Result := List.IndexOf(value);
 end;
  
 procedure Int16Collection.Insert (
   index: Integer; value: Int16);
 begin
   List.Insert(index, value);
 end;
  
 procedure Int16Collection.OnInsert (
    index: Integer; value: System.Object);
 begin
   if (value.GetType <>  System.Type.GetType('System.Int16')) 
   then
     raise ArgumentException.Create (
       'value must be of type Int16.', 'value');
 end;
  
 procedure Int16Collection.OnRemove (
   index: Integer; value: System.Object);
 begin
  if (value.GetType <> System.Type.GetType('System.Int16')) 
  then
     raise ArgumentException.Create (
      'value must be of type Int16.', 'value');
 end;
  
 procedure Int16Collection.OnSet (
   index: Integer; oldValue, newValue: System.Object);
 begin
   if (newValue.GetType <> System.Type.GetType('System.Int16')) 
   then
     raise ArgumentException.Create (
      'newValue must be of type Int16.', 'newValue');
 end;
  
 procedure Int16Collection.OnValidate (value: System.Object);
 begin
   if (value.GetType <> System.Type.GetType('System.Int16')) 
   then
     raise ArgumentException.Create (
       'value must be of type Int16.');
 end;
  
 procedure Int16Collection.Remove(value: Int16);
 begin
   List.Remove(value);
 end;
  
 procedure Int16Collection.set_Item (
   index: Integer; const Value: Int16);
 begin
   List[index] := value;
 end;
  
 //test program
 begin
   SamplesCollectionBase.Main;
 end.

Como saída teremos:


Conteúdos iniciais da coleção:
    [0]:   1
    [1]:   2
    [2]:   3
    [3]:   5
    [4]:   7
  
 Contains 3: True
 2 is at index 1.
  
 Contents of the collection after 
 inserting at index 3:
    [0]:   1
    [1]:   2
    [2]:   3
    [3]:   13
    [4]:   5
    [5]:   7
  
 Contents of the collection after 
 setting the element at index 4 to 123:
    [0]:   1
    [1]:   2
    [2]:   3
    [3]:   13
    [4]:   123
    [5]:   7
  
 Contents of the collection 
 after removing the element 2:
    [0]:   1
    [1]:   3
    [2]:   13
    [3]:   123
    [4]:   7