[Lazarus] Check if an abstract method is implemented or not
Michael Van Canneyt
michael at freepascal.org
Thu Jan 24 14:14:08 CET 2013
On Thu, 24 Jan 2013, Xiangrong Fang wrote:
> This is a clean solution. And as a matter of fact, the compiler does NOT warn me while instantiate class with abstract method.
It definitely does, unless you use a class pointer to do it of course.
In the below example:
TParentClass = Class of TParent;
Var
PC : TParentClass;
begin
PC:=TChild;
C:=PC.Create;
end;
You will not get a warning. But if you run the example as I described it, you get:
home: >fpc -S2 -vwh te.pp
te.pp(15,19) Warning: Constructing a class "TChild" with abstract method "MyMethod"
te.pp(5,15) Hint: Found abstract method: procedure MyMethod(<TParent>);
> This is different than Java,
> in which you must implement all abstract method while inherits from an abstract class.
>
> Why I shall not instantiate a sub-class that has not fully implemented abstract methods of its parent class?
Obviously:
Because then you run the risk that you try to execute a method that is not implemented.
Michael.
>
> Thanks!
> Shannon
>
>
> 2013/1/24 Michael Van Canneyt <michael at freepascal.org>
>
>
> On Thu, 24 Jan 2013, xrfang wrote:
>
> Hi All,
> I wrote a TPainter abstract class, and a TPaintRect class. In the TPaintRect class I have this code:
>
> procedure TPaintRect.OnMouseEnter(Sender: TObject);
> var
> i: Integer;
> p: TPainter;
> begin
> for i := 0 to painters.Count - 1 do begin
> p := TPainter(painters.Objects[i]);
> try
> p.OnMouseEnter(Sender);
> except on EAbstractError do ; end;
> end;
> if Assigned(FOnMouseEnter) then FOnMouseEnter(Sender);
> end;
>
> While running in IDE, the program will crash because OnMouseEnter is abstract.
>
> My problems are:
>
> 1) As I already wrapped it with try-except, I hope it won't trigger IDE exception. But even I turn off "Notify on Lazarus Exception" in
> debugger options it
> still pops up, and the popup said RunError(211), NOT EAbstractError. The program runs well outside of IDE.
>
> 2) Is there a way to detect if an abstract method is implemented or not, without trying to call it and try...except?
>
>
> The following will do it:
>
> uses sysutils;
>
> Type
> TParent = Class
> Procedure MyMethod; virtual; abstract;
> end;
>
> TChild = class(TParent)
> end;
>
> var
> C : TParent;
>
> begin
> c:=TChild.Create;
> If TMethod(@C.MyMethod).Code=Pointer(@system.AbstractError) then
> Writeln('Not implemented')
> else
> Writeln('Implemented')
> end.
>
> When run, it will print 'Not implemented'.
>
> But you should not instantiate objects with abstract methods to begin with.
>
> The compiler warns you if you do.
> (compile the above program with warnings/hints to see it)
>
> Michael.
> --
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>
>
>
>
More information about the Lazarus
mailing list