Original in Russian: http://18delphi.blogspot.ru/2013/03/generic-generic.html
About containers. Table of contents
Akzhan Abdulin has already written it once... I am shaping... I have been using it for already 8 years...
Patterns in Delphi 7:
-------------------------------------------------------------------
Example:
------------------------------------------------------------------------------------------------
IN TOTAL:
----------------------------------------------------------------------------------------------
IntStack.pas:
----------------------------------------------------------------------------------------------
StringStack.pas:
!!!! It is clear that DYNAMIC ARRAY is used here as an example. It is clear that we could have introduced PItemType = ^_ItemType_ and could have operated with pointers and GetMem. But it would have complicated the example.
It is also clear that there is no control of boundary conditions.
Try it. May be, you will like it.
And about the true generic's you can read here - http://keeper89.blogspot.ru/2011/07/delphi.html
One of my realizations of this idea is described here - http://18delphi.blogspot.com/2013/07/2_18.html
About containers. Table of contents
Akzhan Abdulin has already written it once... I am shaping... I have been using it for already 8 years...
Patterns in Delphi 7:
TList = class(Parent)
Add(a: ItemType);
Insert(i: Integer; a: ItemType);
Sort();
end;
..
TList.impl
TList.Sort()
..
CompareItems(a, b) : Integer;
..
Parent = TObject;
ItemType = integer;
{$include TList.intf}
TIntList = class(TList)
..
CompareItems(a, b : Integer) : Integer;
begin
Result := a - b;
end;
{$Include TList.impl}
-------------------------------------------------------------------
Example:
------------------------------------------------------------------------------------------------
IN TOTAL:
stack.imp.pas:
{$IfNDef Stack_imp}
{$Define Stack_imp}
ItemsHolder = array of _ItemType_;
_Stack_ = {mixin} class(TObject)
private
// private fields
f_Items : ItemsHolder;
public
// public methods
procedure Push(const anItem: _ItemType_);
function Pop: _ItemType_;
end;//_Stack_
{$Else Stack_imp}
// start class _Stack_
procedure _Stack_.Push(const anItem: _ItemType_);
var
l_L : Integer;
begin
l_L := Length(f_Items);
SetLength(f_Items, l_L + 1);
f_Items[l_L] := anItem;
end;//_Stack_.Push
function _Stack_.Pop: _ItemType_;
var
l_L : Integer;
begin
l_L := Length(f_Items) - 1;
Result := f_Items[l_L];
SetLength(f_Items, l_L);
end;//_Stack_.Pop
{$EndIf Stack_imp}
----------------------------------------------------------------------------------------------
IntStack.pas:
unit IntStack;
interface
type
_ItemType_ = Integer;
{$Include Stack.imp.pas}
TIntStack = class(_Stack_)
end;//TIntStack
implementation
{$Include Stack.imp.pas}
end.
----------------------------------------------------------------------------------------------
StringStack.pas:
unit StringStack;
interface
type
_ItemType_ = AnsiString;
{$Include Stack.imp.pas}
TStringStack = class(_Stack_)
end;//TStringStack
implementation
{$Include Stack.imp.pas}
end.
!!!! It is clear that DYNAMIC ARRAY is used here as an example. It is clear that we could have introduced PItemType = ^_ItemType_ and could have operated with pointers and GetMem. But it would have complicated the example.
It is also clear that there is no control of boundary conditions.
Try it. May be, you will like it.
And about the true generic's you can read here - http://keeper89.blogspot.ru/2011/07/delphi.html
One of my realizations of this idea is described here - http://18delphi.blogspot.com/2013/07/2_18.html

битая ссылка _http://keeper89.blogspot.ru/2011/07/delphi.html
ОтветитьУдалить