Paul Ishenin wrote:
21.12.2010 16:20, Sven Barth wrote:
http://docwiki.embarcadero.com/RADStudio/en/E2358_Class_constructors_not_allowed_in_class_helpers_(Delphi)


As we don't have them yet...

we have.

And here I thought that I'm closely following FPC development... that must have slipt my attention. How embarrassing. -.-

Paul Ishenin wrote:
I have attached few tests which answers to most of your questions.

Thank you for the tests. They indeed solved some questions, but some are still left.

Would you please test the following:
- identifier visibility if class helper and extended class reside in different units (because I can't believe that a helper can access private members while a derived class can't) - can overloaded methods be defined? (e.g. class contains "Test(a: String);" and helper contains "Test(a: Integer);") - what happens if you define a method in the helper that has the same name as a virtual method in the extended class (without "override" of course ^^) - is a class helper method used in a derived class if the derived class does not contain a method with the same name? - class helper and class in two different units, both containing a method with the same name. which method get's called if the unit with the class is used before the unit with the class helper in the main program?
- can class helpers have fields and if so is their value saved somehow?
- can class helpers extend interfaces?
- can a class helper reintroduce a virtual method from the extended class?

Jonas Maebe wrote:
This feature (virtual class helper methods) might be part of the reason why 
only one class helper can be used, depending on how they handle the class 
helper VMTs. You start getting some kind of multiple inheritance with multiple 
VMTs in terms of figuring out which class helper VMT to pass when calling one 
class helper method from another class helper.

Take this example:
[illustrative example]

This could indeed be the reason why only one class helper is used. So either we follow Delphi compatibility and allow virtual methods in class helpers and forbidding the use of multiple class helpers or forbidding virtual methods and allowing the use of multiple class helpers (although I must admit that I don't yet know which other problems might come around)...


So let me summarize what I know now:
- class helper syntax is the followingː

ClassHelperName = class helper[(BaseClassHelper)] for ExtendedClass
  (...)
end;

BaseClassHelper must be a class helper for the same class.

- in "virtual; abstract;" and "override;" after methods of the extended class generate an error, while "dynamic;" and "virtual;" are allowed

- "message" is allowed but in the end not accessable - should that be forbidden in mode "objfpc"?

- only the first found class helper for a given class is used

- class helpers can not be used in forward declarations

- class helpers can not extend generic classes

- class helpers may not contain destructors

- class helpers may contain constructors, but these need to call the inherited parameterless constructor without any argument as first statement (regarding class constructors I need to read the article linked by Jonas)

- class helpers hide methods with the same name in the ExtendedClass, but not in derived classes - is this a good behavior? (in the current test implementation a class helper method is only searched if no other identifier is found)

Are those assumptions correct so far? Did I miss something we already know?

Maybe I should write a wiki page to have the "specification" saved somewhere :)

Regards,
Sven
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to