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

Xiangrong Fang xrfang at gmail.com
Thu Jan 24 14:21:28 CET 2013


Sorry I overlooked the message. Complie DO emit warnings.

As the use of sub-class is well controlled, I will check in every place the
abstract method is called, so this is ok for me.

Thanks a lot.

2013/1/24 Michael Van Canneyt <michael at freepascal.org>

>
>
> 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<Lazarus at lists.lazarus.freepascal.org>
>> http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus<http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus>
>>
>>
>>
>>
> --
> _______________________________________________
> 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/363a9912/attachment-0003.html>


More information about the Lazarus mailing list