Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Subclass class in PRG file
Message
 
 
To
21/06/2018 13:38:18
General information
Forum:
Visual FoxPro
Category:
Classes - VCX
Miscellaneous
Thread ID:
01660806
Message ID:
01660814
Views:
42
>>>>Hi,
>>>>
>>>>I have a class defined in a prg file (e.g. MyClass.prg). I need to subclass it so that I can replace the code in one of the methods with my custom code.
>>>>
>>>>How do you do it?
>>>>
>>>>TIA
>>>
>>>Dmitry,
>>>
>>>At the time of the subclass definition, the upper class must be in scope by a SET PROCEDURE TO MyClass.prg. You must create a new prg (assuming you don't want to change the original one) in which you just redefine what needs to be changed.
>>>
>>>For instance, this being MyClass.prg
>>>
>>>
>>>DEFINE CLASS SomeClass AS Custom
>>>
>>>  FUNCTION Method_One
>>>    LPARAMETERS Parm1 AS Number, Parm2 AS Number
>>>    RETURN m.Parm1 * m.Parm2
>>>  ENDFUNC
>>>
>>>  FUNCTION Method_Two
>>>    LPARAMETERS Parm1 AS Number, Parm2 AS Number
>>>    RETURN m.Parm1 / m.Parm2
>>>  ENDFUNC
>>>
>>>END DEFINE
>>>
>>>
>>>you may write a different MySubClass.prg with
>>>
>>>
>>>DEFINE CLASS SomeSubClass AS SomeClass
>>>
>>>  FUNCTION Method_Two
>>>    LPARAMETERS Parm1 AS Number, Parm2 AS Number
>>>    RETURN IIF(m.Parm2 = 0, .NULL., m.Parm1 / m.Parm2)
>>>  ENDFUNC
>>>
>>>END DEFINE
>>>
>>
>>Hi Antonio,
>>
>>If I may ask you a follow up question, please.
>>
>>The class that I am creating, by subclassing, will be used in a Form. And the custom method that will have "my" code will have a reference to the form (e.g. thisform.) Which causes the error.
>>How do I use this subclassed object in the Form so that the custom method would be able to reference the Thisform?
>>
>>UPDATE: I think I need to instantiate the class in the INIT of this method using NewObject().
>
>In my view, the best way to do this is to add a property to your custom class to hold a reference to the containing object. Then either pass that object as a parameter to the Init method or use code to set it.
>
>Init method approach:
>
>
>This.NewObject("mynewobj", "mysubclass", "mysubclass.prg", "", This)
>
>
>and in the subclass's Init method:
>
>
>LPARAMETERS toContainer
>
>IF VARTYPE(m.toContainer) = "O" and NOT ISNULL(m.toContainer)
>   This.oContainer = m.toContainer
>ENDIF 
>...
>
>
>Then, you can refer to the container in subclass code as This.oContainer.
>
>Alternatively:
>
>
>This.NewObject("mynewobj", "mysubclass", "mysubclass.prg")
>This.mynewobj.oContainer = This
>
>
>The reason I think this is the best approach is that it keeps the class self-contained and doesn't rely on any SET anything in setting it up.
>
>Tamar

Thank you for your suggestion and for the sample code.
"The creative process is nothing but a series of crises." Isaac Bashevis Singer
"My experience is that as soon as people are old enough to know better, they don't know anything at all." Oscar Wilde
"If a nation values anything more than freedom, it will lose its freedom; and the irony of it is that if it is comfort or money that it values more, it will lose that too." W.Somerset Maugham
Previous
Reply
Map
View

Click here to load this message in the networking platform