interface
  TTest = class
    field: integer;//{问题四}
    procedure StaticMethod();//{问题一}
    class procedure ClassMethod();//{问题三}
    procedure VirtualMethod(); virtual;//or dynamic{问题二}
  public
    procedure PublicVM(); virtual;
  end;implementationprocedure TTest.StaticMethod();
begin
  ShowMessage('SM');
end;procedure TTest.VirtualMethod();
begin
  ShowMessage('VM');
end;procedure TTest.PublicVM();
begin
  ShowMessage('PVM');
end;class procedure TTest.ClassMethod();
      begin
        //VirtualMethod();
      end;看过delphi、.net、java,但delphi中的类设计实在让人迷糊问题一:
delphi中的静态方法有什么用?不像java和.net那样能直接通过类调用。如果说为了实现隐藏机制的话,我在子类用reintroduce不就得了吗?问题二:
既然有了public区域,为什么不把函数过程都放进public里,这样看着多直观啊,public是public,private是private;非在没有方法修饰符的地方定义函数和过程,难道仅仅是为了方便?问题三:
类方法不能访问本类的其他成员,那我们为什么不定义一个包含一堆函数和过程的单元,那样多省事。问题四:
域是不是最好不要出现啊,把所有的域都变成属性不好吗,那样可以对用户的输入进行检测,不对的话可以抛异常,直接把数据暴露出去,是不是太那个了……:)问题五:
class Test { public static int x = 0;},delphi中存在这样的情况吗?多个类的实例共享一个变量?问题六:
请问各位是如何设计一个类的,能把几个主要的步骤写一下吗?

解决方案 »

  1.   

    探讨:(如有不正确的,请指出)
     问题一:我认为delphi里的静态方法是为了区别于virtual和dynamic而存在 
     The reintroduce directive suppresses compiler warnings about hiding previously declared virtual methods.  
     问题二:public,publish 中声明的方法和属性可以作为对象对外公布的接口,而private不行
     问题三:一个类总有部分功能对他的所有对象而言都一样(获得对象实例所属类的类名)于是Object Pascal 提供一种机制确保该类的所有对象实例能够调用的这样的方法而不需要保存指向他们的指针
     问题四:举个简单例子,如果我要利用对象的合成关系怎么办?而我有不想将细节暴露给使用者(如果向你所说)
     问题五:好象没有
      

  2.   

    q1
    那个不是静态定义 class procedure StaticMethod; 这个相当于 c++ 的 static, 这个调用才是用 类名.方法q2 
    那个没有修饰的地方是 ide 自动维护的代码, 人为写的要在有修饰的地方, 没有的相当于 published, 这个只在开发组件时才有用, 在 application 里这样写会有些呵误导q3
    晕~, 这个跟 q1 有点混哈, 简单的说, class修饰 = static 是没有 Self 指针的, 所以不能访问类成员, 但可以送个对像进来. 这样定义跟全局过程&函数区别在于RTTI 信息, class定义的还是有 RTTI 的, 除RTTI外从面像对像上来看就有利于分类函数, 本来嘛, 这个函数只有这个类才用得到, 定义成全局干扰视线哈q4 
    有点不明意思, Field: Integer 可以放在 private 里哈, 这样从外部的用户就无法访问了, 输入检测的方法还是有的, private 里 FField: Integer,  public 里 property Field: Integer read FField write SetField; (ctrl+shift+c) 就会生成 SetField 方法, 里写到 FField := Value(这里可以设检测代码.q5 
    发现楼主对 static 特关心哈, 总得说 delphi 的 class 就是 c++ 的 static, c++ 有的状况 delphi 全有, 
    比方 delphi 不支持多重派生, 但可以用对像包装代替多重派生, 
    c++
      class a;
      class b;
      class c: public a,b;
    delphi
      a = class;
      b = class;
      c = class
      private
        obja: a;
        objb: b;
      public
        access_a_method;
        access_b_method; .. 这的代码就简单的调用 a.method;
        ...
      end;比方 delphi 没有对像实体(声明的对像全是引用), var a: Ta; a 就只能 a := Ta.Create 后才能用, 而不像 c++ 可以用 stack, delphi 对像必须从 heap 建立但 delphi 也有 c++ 不存在的特性哈, RTTI 哈, c++ 从没完整的, 至少每家公司实现得都不一样, interface 支持哈, 这个是分布开发的必须品, 比较 c++&delphi 开发的分布程序, delphi 显得逻辑清晰也没什么难看懂的地方, 声明接口->实现接口没有任何困难; c++ 呵就不说了, 非常有经验的程序员一旦做了 COM, CORBA 一样头晕q6
    ... 不会回答
      

  3.   

    1.delphi的静态方法实际是指静态绑定,与JAVA的静态成员概念是不一样的。
      JAVA的静态成员,DELPHI不支持
    2.没有加修饰符的成员是PUBLICED, 此区域是系统自动生成的代码区,与窗体设计有关的内容。
    3.由于上述第1点,对于多种类实例要访问的公共方法一般是放在类外面的,或者放在一个集中的单元。
    4,这部份是统自动生成的代码区,主要是窗体中的控件和对应的事件处理,由于控件的属性有很多种,系统不可能生成那么多的GET和SET函数,只好PUBLICED。
      

  4.   

    感谢回答
    Q1:这个在Object Pascal Reference的原话
    Static methodsMethods are by default static. When a static method is called, the declared (compile-time) type of the class or object variable used in the method call determines which implementation to activate. In the following example, the Draw methods are static.type
      TFigure = class
        procedure Draw;
      end;
      TRectangle = class(TFigure)
        procedure Draw;
      end;
    刚才在delphi.about.com上看到,class procedure好像就用来创建对象的,没见上面举出别的例子,应该就是这个做用了,呵呵Q4:
    对于域这个还有问题,.NET中全部是放在private内的,比如一个button,.NET中是在form的private,而Delphi中按你的说法是published,就相当public了,那是不是破坏了封装呢?这个是控件还好点,如果是一个变量呢?
    我的意思是,是不是只要出现了
    type TNumber = class
      Int: Integer;
    end;
    这样的情况,我们就该把它改为property来处理呢?我觉得应该这样,呵呵。我想得到一个肯定的答复~~谢谢。Q6:
    这个不用答了,关键是我不知道IDE来对无修饰区域进行管理,呵呵最后问一下,TStringList、TObjectList这样东西,怎么才能了解,delphi帮助有这样的教程吗,还是只能自己去查?