7

As shown in this article, one can define in C#:

public class MyTreeNode<T> where T: MyTreeNode<T>
{

}

In Delphi, however, the following code does not compile and complains "E2003 Undeclared identifier: 'MyTreeNode<>'":

type
    TMyTreeNode<T: TMyTreeNode<T>> = class
    end;

The formal terminology seems to be "self-referencing generics constraint". I wonder how to do this in Delphi ?

PS:

Another useful article as David pointed out.

Relevent SO post regarding Delphi and covariance / contravariance.

Wikipedia page of co/contra-variance.

Community
  • 1
  • 1
SOUser
  • 3,802
  • 5
  • 33
  • 63

1 Answers1

2

There is no way in Delphi to express such a generic constraint. Furthermore, I believe that there is no typesafe way to achieve what can be achieved in C# with such a constraint.

David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
  • 1
    Thank you for your comment ! Could you help to explain more about "there is no typesafe way to achieve what can be achieved in C# with such a constraint" ? – SOUser Apr 23 '14 at 14:06
  • You are using generics because you want type safety. You can implement the container without type safety by abandoning generics. – David Heffernan Apr 23 '14 at 14:14
  • Thank you for your comment ! Could you help to show an example regarding "You can implement the container without type safety by abandoning generics." ? – SOUser Apr 23 '14 at 14:17
  • I suppose that you simply remove the constraint and instead add runtime type checking whenever an element is added to the container. – David Heffernan Apr 23 '14 at 14:20