关于类的一些概念性问题,请大侠指点一下 (100分)

  • 主题发起人 主题发起人 一少
  • 开始时间 开始时间

一少

Unregistered / Unconfirmed
GUEST, unregistred user!
1.加上 virtual 是不是表示的虚拟方法?
2.有没有虚拟类这个这个概念? 如果有,虚拟类和抽象类有什么区别?如果没有,
虚拟方法和抽象方法有什么区别?
3.动态方法和静态方法有什么区别?
4.如何定义一个抽象类?是对其方法加abstract关键字,还是对类加标识?
我看了源码,和一般的类的定义好象并没有什么不同的地方
TStream = class(TObject)
 
抽象类没有实现的方法
 
以前讨论过。
virtual的使用方法:  
  1、如果基类不知道如何实现某方法(只有派生类知道),而基类的其他方法又必须
使用该方法,则把该方法声明为抽象虚方法—— virtual; abstract;(即C++的纯虚函数)。  
  2、如果基类能够为某方法提供一种默认实现,但派生类可能完全重写这个实现,则
将该方法声明为虚方法—— virtual;并实现默认算法。
  3、如果基类能够且必须提供某方法的部分的实现,而派生类必须提供另一部份的实
现,则将该方法声明为非虚方法,并在基类中为其配套提供一个虚方法或抽象虚方法,以
允许由基类本身调用和被派生类覆盖。

Static 对象类型中方法的默认属性——静态
对于静态方法,不必再用标识符来指明它的属性。当调用静态方法时,从变量本身的类
型就可决定运行哪个过程方法。
当编译器遇到AnObject.AStaticMethod的引用时,其中,AnObject是AClass Type 类
的一个变量,则产生调用AClass.AStaticMethod的代码,或者产生调用AClass Type继承来
的AStaticMethod的代码。
Virtual
与静态方法调用相反,虚拟方法调用关不由编译器立即决定。该运行的实际过程主法是
运行时确定的。称为后期绑定。在类成只中可以在任何一方法定义后面加上Virtual。
当引用虚拟方法时,要通过变量所代表的的实际类型来确定该调用哪个过程。造成这种
差别的原因是子孙类可能覆盖它由父类中继承来的虚拟方法。虚拟方法的变化也将被继承下
去。
 
>> 1.加上 virtual 是不是表示的虚拟方法?
是。

>> 2.有没有虚拟类这个这个概念? 如果有,虚拟类和抽象类有什么区别?如果没有,
>>虚拟方法和抽象方法有什么区别?
  有虚拟类这个概念。虚拟类不能有对象实例,而抽象类可以。如我们常用的TStrings类就是一个虚拟类,
所以不能直接用Tstrings来Create一个对象,必须用它的派生类TStringList来实例化。
  虚拟方法必须有实现过程(函数),而抽象方法不能有实现过程,它的实现过程必须由它的派生类继承后实现。

>> 3.动态方法和静态方法有什么区别?
动态方法和虚函数比较象,这两者的区别在于VMT和DMT的不同。
静态方法就是一般的方法。静态方法不能被派生类override。

>> 4.如何定义一个抽象类?是对其方法加abstract关键字,还是对类加标识?
其实抽象类只是一个称呼而已,它仅仅表示含有抽象方法的一种类,它的定义与变通类的定义一样。
对方法加上abstract关键字后,此方法就成了抽象方法。

>>我看了源码,和一般的类的定义好象并没有什么不同的地方
>> TStream = class(TObject)
呵呵,就是一样的啊!

其实我对OOP和Object Pascal也不是十分理解,希望高手能够指点。

 
谢谢大家!
to ego 我感觉有点疑惑,毕竟delphi这方面的资料太少,基本都是谈数据库的,对类的概念我
是在学java时建立起来的,能否再指导一下

1.---------有虚拟类这个概念-------------
如果一个类的方法有virtual标识,又有abstract标识,这个类是虚拟类还是抽象类?

2.-------------虚拟方法必须有实现过程(函数),而抽象方法不能有实现过程---------
我在tstream类中找到这个方法
function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
既是虚拟方法又是抽象方法,如何让它既有实现过程又没有实现过程?

3.--------------静态方法就是一般的方法。静态方法不能被派生类override-----------
这么说静态方法就是终极方法了?你说的“一般的方法”是不是指的不加任何标识的方法?
如procedure aaa; ?



 
没说的了
 
1.加上 virtual 是不是表示的虚拟方法? 是
2.有没有虚拟类这个这个概念? 如果有,虚拟类和抽象类有什么区别?如果没有,
虚拟方法和抽象方法有什么区别?
有,虚拟类,实现多态,抽象类不能实例化
3.动态方法和静态方法有什么区别?
参考多态的概念,一两句话不好讲
4.如何定义一个抽象类?是对其方法加abstract关键字,还是对类加标识?
我看了源码,和一般的类的定义好象并没有什么不同的地方
TStream = class(TObject)
delphi里好像没有吧
java里有abstract关键字
 
ego老兄的对于
2.有没有虚拟类这个这个概念? 如果有,虚拟类和抽象类有什么区别?如果没有,
>>虚拟方法和抽象方法有什么区别?
 
这个问题的回答是不是反了啊?
应该是抽象类可以不可以有实例吧,而且tstring是抽象类啊,他不能创建实例没错
其他的差不多,我就不多说了
 
>>1.---------有虚拟类这个概念-------------
>>如果一个类的方法有virtual标识,又有abstract标识,这个类是虚拟类还是抽象类?
如果一个类的方法中有abstract关键字,那么这个类就是抽象类。而抽象方法是建立在虚方法之上的。

>>2.-------------虚拟方法必须有实现过程(函数),而抽象方法不能有实现过程---------
>>我在tstream类中找到这个方法
>>function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
>>既是虚拟方法又是抽象方法,如何让它既有实现过程又没有实现过程?
如果这样的话,你可以用重载(overload)来实现两个名称相同但参数不同的方法函数。

>>3.--------------静态方法就是一般的方法。静态方法不能被派生类override-----------
>>这么说静态方法就是终极方法了?你说的“一般的方法”是不是指的不加任何标识的方法?
>>如procedure aaa; ?
  是的。

我记得左轻侯曾在大富翁上贴过两篇专门论述Object Pascal和OOP编程的贴子,你可以搜索出来看看。
 
>>function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

你可以在代码的实现部分,找找看这个函数。

所谓抽象,通俗的说:就是光定义一下,什么也不干。
然后在派生类中具体实现。

就比方:老头在外面揽生意,说会干东会干西。其实是只会说说,真正干活的是儿子。
 
function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
这个函数在代码的实现部分是不存在的。
 
谢谢各位!
 
后退
顶部