我在编一个类,但遇到一些疑惑,请大家指教:Type
   Tabc=class
private
   a1:integer;
public
   procedure Seta1(q:integer);
   Function ddd:boolean;
   Function hhh:boolean;
end;implementationprocedre Tabc.seta1(q:integer);
begin
 a1:=q;
.....
end;function Tabc.ddd:boolean;
begin
....
end;function Tabc.hhh:boolean;
var
b:integer;
begin
......
  seta1(b)
  ddd
......
end;我总觉得这个hhh方法有点别扭,它只是一个调用Tabc类中方法的方法,可以将它从Tabc类中剥离出来,而Tabc类不受影响,我完全可以在其他单元需要调用hhh方法时粘贴这段代码。问题是我需要把hhh作为一个公用的函数。
请问大家我该如何修改,程序结构才合理。

解决方案 »

  1.   

    那你在和序的主窗体或一个公用窗体中声明一人全局的hhh函数,功能和你这个类中的一样, 然后再在其它单元中调用不就完了
      

  2.   

    你的hhh在public域内,是公共函数啊。
    不过如果你:
    procedure Seta1(q:integer);
    改为
    property Al:integer read _al write _al;
    更加直观一些。也不用写setall的函数增加开销了
      

  3.   

    同意樓上觀點
    procedure Seta1(q:integer);可以用屬性來代替
      

  4.   

    这样做 ddd显得有点多余了  不过你可能在其他地方用倒是把
    结构也不是太乱  有功底 努力吧
      

  5.   

    procedure Seta1(q:integer);
       Function ddd:boolean;这两个函数你为什么要公共呢?就你这个情况,这两个东西应该给你的类内部使用,放到private里面去,结构就合理了
      

  6.   

    没觉得有什么别扭,如果这段代码很常用,即使没有前后的其他代码,就这两行放在类内部也很合理啊;如果不常用,那就在每次使用时粘贴这两行代码,不存在将这个函数放在外部更合理的问题。Seta1用屬性似乎是合理点,不过那与你提出的问题无关了。不管Seta1是否作为属性,在Tabc.hhh中,直接写a1:=b比较合理。
      

  7.   

    合理的结构:
    Type
       Tabc=class
    private
       a1:integer;
       procedure Seta1(q:integer);
    public
       
       Function ddd:boolean;
       Function hhh:boolean;
    end;
      

  8.   

    我也对鳄鱼说的增加开销有点不太明白
    有什么不一样的吗?
    还有……
    procedre Tabc.seta1(q:integer);
    begin
     a1:=q;
    .....
    end;
    因改不光是赋值A1这么简单,后面还有其他工作,怎么能用属性来代替呢?
      

  9.   

    我现在的写法用起来没有问题,但我觉得在一个类的方法中又调用本类的Public方法有点别扭。ddd我在别的单元中要用到,不能放入private中。
      

  10.   

    没有什么别扭啊,
    1 类主要是封装实现,即使你里面“别扭”也不要让外面别扭
    2 如果是你出现了“重复的调用”,你应该考虑:是否函数接口设计有问题/是否可以简化/将外面不用的函数用在private里
    3 如果你的hhh是一个完整的功能,即使只是几个对其他函数的调用,也应该写在类里面,而不是外面,外面关心的应该是逻辑上的结构,而不是实现的步骤。
    4 放在里面多了一次调用 ,而copy到外面会增加代码,并且不易维护。对系统开销的影响不很大,建议放在里面
      

  11.   

    一个类的方法中又调用本类的Public方法不别扭呀!
    不过看你对hhh的分类如何分而已!一般放在Tabc下很好!
      

  12.   

    (2003-08-01 09:21:15)   
    如果是通过setal来访问al变量的话。
    那么
    call .......
    mov ...,eax
    和直接
    mov ...,self+delta
    (这里delta表示al:integer字段的偏移量)
    来比。
    前一个的运行周期要长些。(通过服务器中转) 
    (2003-08-01 09:21:20)   
    还有一点
    (通过服务器中转) 
    (2003-08-01 09:22:21)   
    而call则保存下一个指令的地址,然后无条件跳转到xxxx处。
    (通过服务器中转) 运行栈(不知道是否这样说)会增大....................
    (2003-08-01 09:24:16)      qxj
    把你的话贴到贴子上去
    (2003-08-01 09:23:43)  
    具体内容就不太清楚了。呵呵,我在Delphi版来之前,总在C++ Builder潜水,看了别人讨论过很多这方面的问题
      

  13.   

    Type
       Tabc=class
    private
      Fa1:integer;
      procedure Seta1(q:integer);
    public
       
       Function ddd:boolean;
       Function hhh:boolean;   property AL: integer read fAL write SetAL;
    end;
    我认为这样是比较合理的,没有必要把hh提到外面去。
      

  14.   

    据个例子:
      type
      tabc=class
        private _al:integer;
        public
            procedure setal(q:integer);
            property al:integer write _al;
      end;
    procedure tabc.setal(q:integer);
    begin
        _al:=q;
    end;然后var abc:tabc;
    begin
      abc:=tabc.create;
      abc.setal(10);
      abc.al:=10;
      abc.free;
    end;
    从abc.setal(10)开始反编译:
    调用 abc.setal(10):
      mov edx,$0000000a 
      mov eax,ebx
      call tabc.setal
    其中abc.setal:
      mov [eax+$04],edx
      ret
    而调用:abc.al:=10:
      mov [ebx+$04],$0000000a
    靠~~区别一下就看出来了。
      

  15.   

    楼主setal方法完成的功能不是单纯的赋值,而是同时进行了其他的处理。类似color,在赋值的同时还需要重画。所以该方法是不可以省略的。如果认为属性比较直观,也只能是:
    property al: integer write setal;(只写)或者
    property al: integer read _al write setal;(读写)
      

  16.   

    谢谢大家,一下我明白了许多。
    本来的hhh过程是从外部拷贝到类中来的,总觉得hhh和类没有多大关联(只是单独实现功能罢了,完全可以剥离出来),放入类觉得结构不合理, 但firetoucher说道“hhh是一个完整的功能,即使只是几个对其他函数的调用,也应该写在类里面,而不是外面,外面关心的应该是逻辑上的结构,而不是实现的步骤”,使我消除了这种误解。
    其次在hhh中seta1(b)的写法应按ImFool所说a1:=b写法,这样才会使hhh方法和这个类才更紧密点。
    另外,seta1是不是用作属性,并不是我要问意思,不过还是要感谢 Eastunfail,我会尽量把seta1改为属性