| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 662 人关注过本帖
标题:请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类、参数 ...
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我在.A(5)下一行加
    .B(3)
  PROCEDURE B(lnTree)
        This.Label2.Caption = "父類中B方法執行的動作"
        IF VARTYPE(lnTree) == "N"
            This.A(lnTree)
        ENDIF
    ENDPROC
VARTYPE(lnTree) == "N",中3是N,则This.A(lnTree)去调用A方法
PROCEDURE A(lnTree)
        This.Label2.Caption = "派生類中A方法執行的動作"
        my_Container::B(lnTree).思路是不是这样?为什么会
出现 This.A(lnTree)此处有错误提示?

2013-01-27 21:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
就是在A中重入B导致错误呀

授人以渔,不授人以鱼。
2013-01-27 21:56
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我的意思是代码最好写成:
.A(5)
.B(3)
PROCEDURE A(lnTree)
        This.Label2.Caption = "派生類中A方法執行的動作"
       当: my_Container::A(lnTree)  **显示lnTree=5,"派生類中A方法執行的動作"
     当 my_Container::B(lnTree)  **显示lnTree=3,"父類中B方法執行的動作"

这样才能体会到作用域::操作符与DODEFAULT()不同功能的作用。正如你所讲的::: 直接指定父類中需求執行的事件或方法,不限於本身A方法的父代碼,DODEFAULT()只能執行本身A方法的父代碼。


2013-01-27 22:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
哦,你明白了意思就可以自己写的。还是那句,变着法子多测试慢慢就懂了。

授人以渔,不授人以鱼。
2013-01-27 22:06
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
程序代码:
我不知道怎样改,瞎改了,不要见笑。.A(5),.B(3)次序前后二种情况, 分别调用 my_Container::A(lnTree) 与my_Container::B(lnTree)  


 

frm_Test = CREATEOBJECT("Form")
WITH frm_Test
         .AddObject("Container1", "SubContainer")           
    WITH .Container1
        .Arrange
                                                        
        .A(5) 
        .B(3)
        .Visible = .T.
    ENDWITH
    .AutoCenter = .T.
    .Show(1)
  

ENDWITH
RETURN 

* 父類定義
DEFINE CLASS my_Container AS Container

    ROWcount = 10
    Indexid = 1
   
    ADD OBJECT Label1 AS Label WITH Caption = "", Top = 5, Left = 5, Height = 25, AutoSize = .T.
    ADD OBJECT Label2 AS Label WITH Caption = "", Top = 35, Left = 5, Height = 25, AutoSize = .T.

     PROCEDURE Arrange
         WITH This
             .Top = 5
             .Left = 5
             .Height = ThisForm.Height - .Top - 5
             .Width = ThisForm.Width - .Left - 5
         ENDWITH
     ENDPROC
    
    PROCEDURE A
        LPARAMETERS lnTree
       
         IF (PCOUNT() < 1) .OR. (VARTYPE(lnTree) != "N")
             lnTree = THIS.Indexid
         ELSE
             IF lnTree > THIS.ROWcount
                 lnTree = THIS.Indexid
             ENDIF
         ENDIF
         This.Label1.Caption = "lnTree = " + STR(lnTree,3)

    ENDPROC
   
    PROCEDURE B(lnTree)
              
        This.Label2.Caption = "父類中B方法執行的動作"
        IF VARTYPE(lnTree) == "N"
           *This.A(lnTree)  &&去调用A方法
     This.Label1.Caption = "lnTree = " + STR(lnTree,3)
      
       ENDIF
   
    
   
    ENDPROC 

ENDDEFINE

* 派生類定義
DEFINE CLASS SubContainer AS my_Container

    PROCEDURE A(lnTree)
        This.Label2.Caption = "派生類中A方法執行的動作"
        my_Container::A(lnTree)                && 直接指定父類中需求執行的事件或方法,不限於本身A方法的父代碼
        *DODEFAULT(lnTree)                    && 只能執行本身A方法的父代碼
    ENDPROC                                
DODEFAULT()
ENDDEFINE
----------------------------------------------------
现在出现
一)当
.A(5)
.B(3)
时

1。my_Container::A(lnTree)  出现lntree=3,父类中B方法执行动作
2、my_Container::B(lnTree)  出现lntree=3,父类中B方法执行动作


二)当

 .B(3)

 .A(5)
时

 1、my_Container::A(lnTree) 出现lntree=5,派生类中A方法执行动作

 2。my_Container::B(lnTree)  出现lntree=5,父类中B方法执行动作

问题1.A()与.B()好象调用自定义函数一样,调用A(5)把5给  PROCEDURE A
,调用B(3)把3给PROCEDUREB(lnTree),为什么A(5),B(3)前后写法其结果会出现不同的变化?
问题2。第一种为什么执行的动作会一样?


[ 本帖最后由 sylknb 于 2013-1-27 22:59 编辑 ]
2013-01-27 22:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这个测试代码只是用来说明可以这样调用,并不是说这样的代码有何意义,出现循环调用就是错误的用法。

授人以渔,不授人以鱼。
2013-01-27 23:52
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
WITH frm_Test,那么里面的.AddObject()就是调用frm_Test的AddObject()方法,亦即frm_Test.AddObject()的简写。当你要对某个对象大量调用和引用其方法和属性时,就可以用这种简写格式,节省书写时间,不用每一行都敲上frm_Test字眼
 
TonyDeng班主:

wITH frm_Test
      .AddObject("Container1", "SubContainer")
1。为什么写成:
wITH frm_Test.AddObject("Container1", "SubContainer") 提示数据类型不正确?

2。 WITH  .Container1 &&.Container1 的父对象是誰?
2013-01-28 11:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
WITH 后面的是对象,你跟的是对象的方法,当然错了。
WITH frm_Test
    WITH .Container1        && 这是 frm_Test.Container1,把上面的frm_Test放到.前面
    ENDWITH
ENDWITH

授人以渔,不授人以鱼。
2013-01-28 13:14
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
再一次谢谢!新颖的写法,又学了一招。
2013-01-28 13:49
快速回复:请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018308 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved