<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:109516703;
mso-list-type:hybrid;
mso-list-template-ids:-1316317682 -1 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level2
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level3
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level4
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level5
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level6
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level7
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level8
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level9
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
--></style></head><body lang=EN-GB link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Further to the ranges in generics discussion....... more on generics</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>There is always a way to do that using an abstract class. The things of interest creating the idea are:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=1 type=1><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Imagine a short hand syntax for abstract classes:<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Generic classAbs<T> = class(TObject)<o:p></o:p></p><p class=MsoNormal> Class generic variable: TObject;<o:p></o:p></p><p class=MsoNormal>End;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>abClass = specialize classAbs<abstract>;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>// This allows a short hand, and<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=2 type=1><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Some possible crazy inheritance:<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Generic classAbs<T,Q> = class(Q)<o:p></o:p></p><p class=MsoNormal> Class generic variable: TObject;<o:p></o:p></p><p class=MsoNormal>End;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>abClass = specialize classAbs<Integer, abstract>;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>// which allows a form of polymorphic inheritance similar to interfaces, but short hand for interface variables.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=3 type=1><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Some code optimization for less cache thrashing<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Class generic procedure classAbs.doSomething(T);<o:p></o:p></p><p class=MsoNormal>//generic procedure x.y(T); this also<o:p></o:p></p><p class=MsoNormal>Begin<o:p></o:p></p><p class=MsoNormal> // enforce no usage of field and methods on T, such as T.specificToClass()<o:p></o:p></p><p class=MsoNormal style='text-indent:36.0pt'>// allows same piece of code to be used for all types of same sizeof()<o:p></o:p></p><p class=MsoNormal style='text-indent:36.0pt'>// so less code to fill the L1 instruction cache, and the L2 cache is less burdened<o:p></o:p></p><p class=MsoNormal style='text-indent:36.0pt'>// of course this speed and code size optimization could be detected without this<o:p></o:p></p><p class=MsoNormal style='text-indent:36.0pt'>// but enforcing it could always be an option.<o:p></o:p></p><p class=MsoNormal>End;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=4 type=1><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Compile time virtual kind of resolution<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>// As an abstract class would have many virtual abstract methods there would be a pointer indirection from the VMT.<o:p></o:p></p><p class=MsoNormal>// Any generic procedure or method could, if not virtual, be compiled in and so not need a virtual specifier.<o:p></o:p></p></div></body></html>