[fpc-pascal] Classes and class methods
Mark Morgan Lloyd
markMLl.fpc-pascal at telemetry.co.uk
Wed Feb 9 13:41:50 CET 2011
Mark Morgan Lloyd wrote:
> 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]
More information about the fpc-pascal
mailing list