| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 662 人关注过本帖
标题:请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类、参数 ...
取消只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:9 
请教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
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册:2006-6-3
收藏
得分:0 
TonyDeng:
先谢了,前面开头的问题也请指教 一下。
2013-01-27 20:48
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册:2006-6-3
收藏
得分:0 
我现调用b
 在开始处加上.B(3),然后 my_Container::B(lnTree)。出现提示
图片附件: 游客没有浏览图片的权限,请 登录注册

应如何修改?才能正确调用父类B方法?
2013-01-27 21:01
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册: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
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册:2006-6-3
收藏
得分:0 
按你的,也是那种错误的提示:
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-01-27 21:28
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册: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
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册: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
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册: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
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册: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
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1539
专家分:180
注 册:2006-6-3
收藏
得分:0 
再一次谢谢!新颖的写法,又学了一招。
2013-01-28 13:49
快速回复:请教TonyDeng :你 于 2011-7-14 23:29 编辑VFP自定义类中 父类、子类 ...
数据加载中...
 
   



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

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