>Hi,
>
>What is a good practice when a form is based on another form, as far as where to place the dodefault() in the child form?
>
>My feeling is that it should be at the top of the child form method. For example.
>
>Say a base form is mybaseform (in MyBaseForms.vcx). And it in the INIT method of this form there is a code.
>
>Then you create a new form MyChildForm based on the MyBaseForm. And it has some code in the INIT() method too. I think that in the child form INIT method the sequence should be as follows:
>
>
>*-- Init method of child form
>dodefault()
>*-- put the code specific to the child form INIT method
>
>
>Does the above make sense or there is/are issue(s)?
>
>TIA
One additional thing you may need to take into account is, that in certain circumstances the superclass code may return a value. For instance in the form, the original init method may return .F. to prevent the form from instantiating for several reasons (user access level, data cannot be loaded, licensed functionality etc.)
If you expect the init to be able to return .F. you need to validate the result. If you create a subclass, you want as much as possible keep the same interface signature, because code that uses those classes depend on the specific behavior of the original class. Otherwise you get an italian dish instead of clean code.
See also Liskov Substitution Principle for more complex situations:
"Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it."
LOCAL llRetVal
llRetVal = DODEFAULT()
IF m.llRetVal
ENDIF
RETURN m.llRetVal
Christian Isberner
Software Consultant