关于Interface和抽象类,怎么办,选哪个?(100分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
上次我提过个interface的问题,大部分人都说它和抽象类相似。
现在我想设计个系统,但是不知道是先建立抽象类好呢?还是用interface好?
好象都差不多??? 我的倾向是建立抽象类,但是想试试interface,咳,东西理解
不深刻,所以。。。。。 :(
 
只是这个类设计出来只是给自己用的话,那还是用抽象类吧。否则
可以提供接口给其他应用程序或者跟操作系统结合。
 
楼上说的很对,要看你的具体用途。
抽象类是为了以后的继承 体现多态
interface是为了更广扩的使用范围
 
我有个想法: 如果我所有的类都有个父类,这个父类是由TOBJECT出来的。那么如果我中途有
个类想从其他的类继承---比如说我要写个线程类,那么这个框架就无法完成了,因为DELPHI
不能实现多重继承。但是如果是从INTERFACE出来的,就没这个问题。大家是怎么看的?
 
>>我有个想法: 如果我所有的类都有个父类,这个父类是由TOBJECT出来的。
有如果吗? 你用delphi写的类 它的老祖宗当然都是TObject。

>>那么如果我中途有个类想从其他的类继承---比如说我要写个线程类,那么这个框架就无法完成了
关于这一点 你可以看看VCL的Source。
当然也可以用Interface,你可以这样:
TMyObject = class(TOldObject,IMyInterface)
 
楼上的,你没明白我的意思。
我的父类是我自定的一个(当然他是从TOBJECT出来的),对于我系统来说他就是最底的类。

第二点: 我只想从TTHREAD里继承个线程类出来(但子类又已经是从我定义的父类继承了,
DELPHI不能多重继承)。这个似乎不好用INTERFACE实现?我知道VCL自己实现了TTHREAD类,但我不想再实现一次吧?
 
>>这个似乎不好用INTERFACE实现?
那请你告诉我 什么才需要用INTERFACE呢?
 
靠,我不就是想问这个问题嘛,你倒反过来问我。:(
 
首先,不能如此理解对象的继承
面向对象不是为了实现而面向对象,继承不是为了继承而继承
一架正在飞行的飞机,需要在后台检查燃油是否够,那么飞机的类是否该从线层类继承过来呢?
显然不是如此的,飞机是飞机,线层只是飞机用到的.
这个例子在DELPHI的通讯类里同样遇到,DELPHI的SOCKET类里同样使用到了线层.
遇到这样的情况,我们既没有必要去追求如何从线层继承(倘若飞机是从TTHREAD继承而来,
我就大跌眼镜了),当然也不需要重新编写线层类.
我们可以"使用"线层类.
例如:
Type TPlane=Class(TFlyObject)
Private
FCheckOilThread:TThread / TCheckOilThread;
..............
end;

这种方法有人取了名字叫聚合,其实土一点就叫使用.

Interface这样的东西,在其他某些语言中有其他更好的理解方法
叫做feature,也就是特性,不过那是多重继承的问题,使用聚合也可以类似地解决.
例如:procedure TXXXX.proc1;
begin
FMyThread.proc1;
end;

实质上Interface更多的只是属于操作系统而非面向对象.
 
在这个问题上我与吴剑明有同感。有一次我真的打算使用Interface了,几乎代码快写完了。
还是推倒重来了。有时候觉得Pascal不支持多继承真的好麻烦。解决多继承的方案无非是使
用Interface或者类包容,就是将另一个类的实例放到新的类中作为一个字段。可是,Interface
的问题是从哪儿重载类:TInterfacedObject或者TAgg..Object?
你看看我有个案例:
资源 子资源信息 计量表信息 销售信息 物业费信息 ...
|-街道 [X]
|-小区 [X] [X] [X]
|-楼宇 [X] [X] [X] [X]
|-房屋 [X] [X] [X]
显然需要四个接口最合理。可是我最后还是只用类来实现。因为哪个接口不定什么时候就
被释放了!
 
我倒觉得用接口好点,可以规定行为,可以实现和具体业务逻辑无关。具体逻辑可以在类实现接口
时来实现。在实现的过程中,实现接口的类可以是个抽象类??? 好象复杂了点。再整理整理,
哪个大哥还有高见。
 
接口一般来讲只是用在COM对象中,
最好用抽象类,
 
多人接受答案了。
 
后退
顶部