Mark Morgan Lloyd wrote 45 lines
Marco van de Voort wrote:
> In our previous episode, Mark Morgan Lloyd said:
>> Is it possible to put a class (not an instance) in a variable or
>> array element, and to use this to call a class method?
>>
>> I'm defining a hierarchy of classes and it would be convenient if it
>> were possible to register the fact that a class had a particular
>> subclass, such that the information was available before instantiation.
>>
>> I'm assuming that the code that inspects the array has imported all
>> units so is aware of the relevant class declarations, but I am still
>> having problems with calling class methods and/or casting to a class
>> (as distinct from an instance).
>
> Afaik this route you can only call static methods of the basetype of the
> class-type.
>
> So if it is A= class
> end;
> b=class(a)
> end;
> c=class(b);
>
> TClasstype = class of B;
>
>
> var x : TClasstype;
>
> begin
> x:=C;
>
> x.staticmethod
>
> then staticmethod must be visible in B. It doesn't matter which
> descendant
> of B you assign to X.
>
> This is logical, since static methods are entirely compiletime, and the
> compiler can't know what type will be runtime assigned.
Thanks Marco, I was beginning to suspect that I was hitting limitations
and that what I was trying to do might be ill-advised.
I'm finding virtual class methods useful when I'm able to refer directly
to a class, rather than going via a reference to a class.
I'm doing something wrong- it works.
I've got a sequence of classes, each with a Parent class procedure and Children() class function which reference a global array associated with each class (hardcoded name). Each class also has an Oid() function which appends a hardcoded number to whatever it's inherited.
If a test program does this
WriteLn(OidToStr(TIso.Oid));
WriteLn(OidToStr(TIso.Children[0].Oid));
WriteLn(OidToStr(TIso.Children[0].Children[0].Oid));
WriteLn(OidToStr(TIso.Children[0].Children[0].Children[0].Oid));
I get this
.1
.1.3
.1.3.6
.1.3.6.1
i.e. each reference to Children() is identifying the correct method, despite the fact that this is spread over more than one file.
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]