| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 662 人关注过本帖
标题:请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类、参数 ...
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:18 
请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类、参数联系?派生子類就必須這樣中有的代码不明白
下面是你在<2011年对VFP自定义类中 父类、子类、参数联系? 中 对派生子類就必須這樣:的代码>,有几个问题不清楚,请教一下
VFP自定义类中 父类、子类、参数联系?  
派生子類就必須這樣:
程序代码:

frm_Test = CREATEOBJECT("Form")
WITH frm_Test                                         ??是不是在frm_test的对象中设置属性,但它的属性是再创建对象frm_test.container1
    .AddObject("Container1", "SubContainer")            
WITH .Container1                                    ?? .Container1前面的小黑点.表示何意义?
                     
         .Arrange                                       ??在对象中可以设置自定义方法,及调用方法.                                   
        .A(5)
        .Visible = .T.
    ENDWITH
    .AutoCenter = .T.                          ??这里的.AutoCenter前面的小黑点表示哪一个对象?是不是frm_Test对象?
    .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)
        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                                ??上面二句代码运行后显示没有什么区别?有何作用?都是SubContainer 子类去调用它的父类my_Container(前面用粗体表示) ,并传递参数
   
ENDDEFINE



[ 本帖最后由 sylknb 于 2013-1-27 15:01 编辑 ]
搜索更多相关主题的帖子: color 
2013-01-27 15:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在这里,DODEFAULT()和my_Container::A()是等价的,但使用my_Container::这种类引用比DODEFAULT()更灵活,即可以写成是my_Container::B()。注意:DODEFAULT()是视当前方法的名称而定,当前方法是A,那么DODEFAULT()的也只能是父类的A方法,不能是别的方法,而直接类引用就可以调用父类的任何方法,不需局限于A方法。这就是两者的区别。

授人以渔,不授人以鱼。
2013-01-27 20:42
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
TonyDeng:
先谢了,前面开头的问题也请指教 一下。
2013-01-27 20:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
WITH/ENDWITH包裹着什么,里面的.前面就是什么。WITH frm_Test,那么里面的.AddObject()就是调用frm_Test的AddObject()方法,亦即frm_Test.AddObject()的简写。当你要对某个对象大量调用和引用其方法和属性时,就可以用这种简写格式,节省书写时间,不用每一行都敲上frm_Test字眼(这是程序代码自动生成器不会给你做的,所以你看到那些自动编码器的代码都是一大串这种重复文字)。这种简写方式可以嵌套使用。

其实我已经说过这是VB中就已经有的语法,包括在Office的宏程序中VBA也是这样。

授人以渔,不授人以鱼。
2013-01-27 20:55
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我现调用b
 在开始处加上.B(3),然后 my_Container::B(lnTree)。出现提示
图片附件: 游客没有浏览图片的权限,请 登录注册

应如何修改?才能正确调用父类B方法?
2013-01-27 21:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
你要注意这个代码中B是调用了A的,你直接调用B,当然循环调用了。可以有这种调用,不是叫你不顾实际动作去调用一番。

授人以渔,不授人以鱼。
2013-01-27 21:04
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
父类my_Container 定义了二种方法:PROCEDURE A(lnTree)与PROCEDURE B(lnTree),在泒生子类SubContainer 中去调用my_Container 另一种方法

 派生類定義
DEFINE CLASS SubContainer AS my_Container

    PROCEDURE A(lnTree)
        This.Label2.Caption = "派生類中A方法執行的動作"
        my_Container::A(lnTree)改为 my_Container::B(lnTree)不是A在调用B吗?怎么是B调用B?糊了了!搞不懂了。





[ 本帖最后由 sylknb 于 2013-1-27 21:24 编辑 ]
2013-01-27 21:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
    PROCEDURE B(lnTree)
        This.Label2.Caption = "父類中B方法執行的動作"
        IF VARTYPE(lnTree) == "N"
            This.A(lnTree)
        ENDIF
    ENDPROC

授人以渔,不授人以鱼。
2013-01-27 21:18
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
按你的,也是那种错误的提示:
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-01-27 21:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我8楼是告诉你B原本写的就是当参数是数值型时会调用A,你有没有仔细琢磨代码呀。

授人以渔,不授人以鱼。
2013-01-27 21:30
快速回复:请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类 ...
数据加载中...
 
   



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

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