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]
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to