>     element := C(list[index]);   // casting back
>     text := element.text;
> I cannot do that, even if elements all are *indirect* instances of C, because
> this calls C.text instead of the element's own proper text method.

If you use virtual methods then C.text should call the descendant's method. 
This 
is what polymorphism, the most powerful concept in object oriented programming, 
is all about.

> Side-question: it seems, when subclassing, that methods with same name and
> same parameters do not need any modifier keyword (such as "override"
> or "overload"). Eg I can have  
>     function text;
> in both a superclass C0 and a subclass C1 work as expected. Correct?

This is likely your problem. If you are not using virtual methods then you are 
not going to get polymorphism.

Here's a sample program to illustrate:

{$mode objfpc}
type
  C0 = class
    procedure statictext;
    procedure virtualtext; virtual;
  end;

  C1 = class (C0)
    procedure statictext;
    procedure virtualtext; override;
  end;

procedure C0.virtualtext;
  begin
    writeln ('C0 virtual');
  end;

procedure C0.statictext;
  begin
    writeln ('C0 static');
  end;

procedure C1.virtualtext;
  begin
    writeln ('C1 virtual');
  end;

procedure C1.statictext;
  begin
    writeln ('C1 static');
  end;

var
  a : C0;
  b : C1;
  p : pointer;
  t : tobject;

begin
  b := C1.create;
  p := b;
  a := C0(p);
  a.statictext;   // output: C0 static
  a.virtualtext;  // output: C1 virtual

  // let's add another degree of removal
  t := tobject(p);
  C0(t).statictext;
  C1(t).statictext;
  C0(t).virtualtext;
  C1(t).virtualtext;
end.


Cheers,
David

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to