Currently you can't do
type
generic TFoo<A> = class
procedure Bar; virtual;
end;
generic FooChild<F: TFoo> = class(F)
procedure Bar; override;
end;
However, without giving the TFoo you can't do the "Bar; override",
because it wont know that the base class has a virtual Bar method.
In many case you can make the first class non generic.
But if you have several generics like that and they all take base
classes as generic param, in order to then do something like
TFinal = class(
specialize TBase1<
specialize TBase2<
specialize TBase3<TSomething>
>
>
)
end;
Then they all must be generics....
So in that case it would be nice to allow the generic as constraint.
---------------------------
On a related note, if building classes like that, there is another
problem...
generic TClassExtender<B: class> = class(B)
constructor Create; // override
// same for other methods
end;
constructor TClassExtender.Create;
begin
inherited;
MyInit;
end;
the base class used in specialization may have a constructor that takes
arguments....
Then you can't override/reintroduce those, because you don't yet know
all the base classes.
It would be nice to have something (idea wise / not syntax wise)
generic TClassExtender<B: class> = class(B)
generic override constructor Create; // override
// same for other methods
end;
That would create the same constructor for each version the base class has.
- call the correct inherited
- have the same code around the inherit
Not sure if this should be limited for virtual/override / or be for any
method.
(same for ordinary methods)
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel