[Lazarus] Check if an abstract method is implemented or not

Xiangrong Fang xrfang at gmail.com
Thu Jan 24 14:03:36 CET 2013


This is a clean solution. And as a matter of fact, the compiler does NOT
warn me while instantiate class with abstract method.   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?

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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20130124/f5e1c7d5/attachment-0003.html>


More information about the Lazarus mailing list