Xiangrong Fang wrote 20 lines
Hi all,
I have two questions about generics. I am writing a two-dimensional
table class. Say:
type
generic TTable<TValue> = class
... ...
public
constructor Create(ADefaultValue: TValue);
end;
My questions are:
1) if I am not writing a generic class I can define default value for
the constructor, i.e.
constructor Create(ADefaultValue: Double = 0);
for generic classes, how can I define a default value?
You can use the new intrinsic Default(TypeName) which is available in FPC 2.7.1. Your declaration would look like this:
=== snippet begin ===
constructor Create(ADefaultValue: TValue = Default(TValue));
=== snippet end ===
You need to pay attention though with what you specialize TTable. You can't use a record for example, because records can not have default values in parameters (this has nothing to do with generics or the Default() intrinsic). Classes and interfaces are ok they as are all primitive types.
As a sidenote: Default() can not only be used in constructor parameter lists, but also for normal functions and in normal code. Using it in const sections or var sections does not yet work in every case (primitive types work, classes, interfaces, records and objects do not).
Show quoted text 11 lines
2) if I cannot define a default value, I hope to do so while
specializing it. i.e.
type
TNumericTable = specialize TTable<Double>
public
constructor Create(ADefaultValue: Double = 0); override;
end;
That is, can I "inherit" a generic class while specializing it?
You would need to write it this way:
=== code begin ===
type
TNumericTable = class(specialize TTable<Double>)
public
constructor Create(ADefaultValue: Double = 0);
end;
constructor TNumericTable.Create(ADefaultValue: Double);
begin
inherited Create(ADefaultValue);
end;
=== code end ===
Regards,
Sven