[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