应该不行,在Delphi中所有的类都是从object中直接或者间接继承过来的

解决方案 »

  1.   

    不行的,祖先的祖先的祖先的祖先.......是TObject.
      

  2.   

    Freedom:
        Delphi 所有的类都是 TObject 继承过来的,所以你就不要多想了。
    问:
        为什么不要从 TObject 继承而来呢?
        你可以当它透明呀!比如定义的时候,就可以这么定义:
        TMyClass = Class
         
        end;
        
      

  3.   

    Delphi已经是第五版了,我不知道Inprise的设计思想是什么,这个问题应该不是设计的缺陷,可是,如果用户需要自定义一些特殊的类型,比如复数(complex,在C++中是方便而又方便了,而且有运算符重载).可在Delphi中怎么办呢?很不方便。请教原因。谢谢!
      

  4.   

    可以的。采用下面这样的形式:type
      TMyObj = object
      
        // ... 定义  end;  TMyChild = object(TMyObj)  end;TMyObj 这各类就不是从 TObject 派生的,它是保留了老的 Turbo Pascal 面向对象性质,TMyObj 这个类没有祖先类,而 TMyChild 是从 TMyObj 派生的。其 OOP 性质和 C++ 是一样的。但是不提倡这样做。因为以 Object 关键字代替 class 定义的类不能从 TObject 派生子类,不能得到 TObject 类带来的先进特性,如虚拟构造函数、RTTI 等等。其实 TObject 类已经具备了 C++ 的模板功能,是非常高效优秀的,既然 C++ 大量的应用模板不就是为了能够达到 类的高级功能而不是简单的继承派生,而 TObject 正是实现着的最好的办法,用最简捷的法是实现了 C++ 用复杂方式才能实现的东西,何乐而不为?
      

  5.   

    朋友,我非常感谢你的答复。虽然我在回家的路上已经开始想到古老的Object关键字了。可我还没来的及实验,你就告诉了我。看来我猜对了。很高兴认识你!谢谢
    面向对象是思想,而不仅仅是语言的差别,它只是实现的工具。我觉得应该对面向对象有更深刻理解的应该是哲学家和生物学家才对。呵呵。再次感谢
      

  6.   

    一点意见:
       Phoenix2000(Phoenix2000),你的 TMyObj的定义,其实也是从 TObject 派生而来,
    因为 Delphi 缺省的就是从 TObject 派生,你没有办法逃避的。
    你的这个定义,只是从视觉上来说好像实现了 Freedom 的想法而已。
     
     
      

  7.   

    一点建议:
        请看文章:[转贴]DELPHI的原子世界(1)
                 [转贴]DELPHI的原子世界(2)
      

  8.   

    你好,Musicwind。文章我已看过。非常好。只是我想问,那又如何实现自定义的类呢?比如complex。我们无论如何都要这个TObject原子,岂不非常局限?!另外,能告诉我文章的出处在哪儿吗?谢谢
      

  9.   

    Musicwind(风里来雨里去):  看来你没有试验一下我的代码。这个 TMyObj 类根本和 TObject 派生的子类是无关的。我已经说了,object 关键字是为了保留兼容 Turbo Pascal 的 OOP 性质而留下来的。以 object 代替 class 关键字就会导致所定义的类的根本结构。TMybj 类不具备 TObject 派生类的许多功能,例如虚拟构造函数、类方法、RTTI 以及类模板的功能,同时不具备接口融合的功能,无法声明实现多个接口纯虚类的继承。如果你不信的话,可以看看以下的试验:type
      PMyObj = ^TMyObj;
      TMyObj = object;
        constructor Create;
      end;
    var
      p: PMyObj;     //类指针
      MyObj: TMyObj; //类变量
    begin
      p := TMyObj.Create(nil); // 这样代码是不可能编译通过的!
      New(p, Create); // 这样使用构造函数
      MyObj.Create; // 这样使用构造函数
      // p^.ClassType 或者 MyObj.ClassType 这样的表达是错的,因为它们的类 TMyObj 不是从 TObject 派生的,根本不具备 RTTI 性质,无从谈起 ClassType 这样的类方法。
    end;在 Delphi 中,TObject 类的派生类对象实质上全部都是指针,调用其构造函数同时也就是在为指针分配内存。而用 object 关键字所定义的类,既可以有编译器直接在堆上分配内存的变量,也可以有引用模式的类指针,后者和 Delphi 的 TObject 类体系有些相似,而前者和普通 C++ 类相似。说倒操作符重载,Object Pascal 不支持。因为操作符重载在 TObject 中有部分实现,更多的情况是使用函数来替代。其实,C++ 的操作符重载本质上就是函数的重载,因为 C++ 中的操作符也是类的方法函数,没什么特别的。
      

  10.   

    同意楼上的。
    原来我讨论的一直都是 Class 作为关键字。
    而没有注意到 用Object作为关键字。
    对的,Phoenix2000 说得有道理!