请教:在Delphi中如何自定义基类,不在使用默认的TObject.在C++中很容易,但在Delphi中好象不行。谢谢 应该不行,在Delphi中所有的类都是从object中直接或者间接继承过来的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不行的,祖先的祖先的祖先的祖先.......是TObject. Freedom: Delphi 所有的类都是 TObject 继承过来的,所以你就不要多想了。问: 为什么不要从 TObject 继承而来呢? 你可以当它透明呀!比如定义的时候,就可以这么定义: TMyClass = Class end; Delphi已经是第五版了,我不知道Inprise的设计思想是什么,这个问题应该不是设计的缺陷,可是,如果用户需要自定义一些特殊的类型,比如复数(complex,在C++中是方便而又方便了,而且有运算符重载).可在Delphi中怎么办呢?很不方便。请教原因。谢谢! 可以的。采用下面这样的形式: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++ 用复杂方式才能实现的东西,何乐而不为? 朋友,我非常感谢你的答复。虽然我在回家的路上已经开始想到古老的Object关键字了。可我还没来的及实验,你就告诉了我。看来我猜对了。很高兴认识你!谢谢面向对象是思想,而不仅仅是语言的差别,它只是实现的工具。我觉得应该对面向对象有更深刻理解的应该是哲学家和生物学家才对。呵呵。再次感谢 一点意见: Phoenix2000(Phoenix2000),你的 TMyObj的定义,其实也是从 TObject 派生而来,因为 Delphi 缺省的就是从 TObject 派生,你没有办法逃避的。你的这个定义,只是从视觉上来说好像实现了 Freedom 的想法而已。 一点建议: 请看文章:[转贴]DELPHI的原子世界(1) [转贴]DELPHI的原子世界(2) 你好,Musicwind。文章我已看过。非常好。只是我想问,那又如何实现自定义的类呢?比如complex。我们无论如何都要这个TObject原子,岂不非常局限?!另外,能告诉我文章的出处在哪儿吗?谢谢 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++ 中的操作符也是类的方法函数,没什么特别的。 同意楼上的。原来我讨论的一直都是 Class 作为关键字。而没有注意到 用Object作为关键字。对的,Phoenix2000 说得有道理! 如何用isapi过滤器获取服务器返回给客户端的数据,我不需要修改数据,只想获取 用delphi对word操作进行评分(比对和分数设置问题) 一个简单的问题50 怎么得到ListView中选择的列序号 请高手帮忙指导一下斑马打印机s300打印中文的编程方法 急求控件 高手请进,一个让人郁闷的问题! 请教各位高手如下问题... 如何在bmp中运行exe文件? SQL是怎么了啊!完蛋了啊! 关于三层数据库,急!!! 听说本站为共享软件作者提供20M空间,如何得到?
Delphi 所有的类都是 TObject 继承过来的,所以你就不要多想了。
问:
为什么不要从 TObject 继承而来呢?
你可以当它透明呀!比如定义的时候,就可以这么定义:
TMyClass = Class
end;
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++ 用复杂方式才能实现的东西,何乐而不为?
面向对象是思想,而不仅仅是语言的差别,它只是实现的工具。我觉得应该对面向对象有更深刻理解的应该是哲学家和生物学家才对。呵呵。再次感谢
Phoenix2000(Phoenix2000),你的 TMyObj的定义,其实也是从 TObject 派生而来,
因为 Delphi 缺省的就是从 TObject 派生,你没有办法逃避的。
你的这个定义,只是从视觉上来说好像实现了 Freedom 的想法而已。
请看文章:[转贴]DELPHI的原子世界(1)
[转贴]DELPHI的原子世界(2)
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++ 中的操作符也是类的方法函数,没什么特别的。
原来我讨论的一直都是 Class 作为关键字。
而没有注意到 用Object作为关键字。
对的,Phoenix2000 说得有道理!