~Delphi中 接口和抽象类 漫谈~
无聊,考虑了一下所知道的“接口”和“抽象类”的知识,发现了一些很有趣的东西,记如下:
1,虽然接口中的所有方法都是可见的,但实现接口的类中,所对应的方法并不一定是可见的。嗯,很拗口,看代码
type IHouse = Interface procedure SayHello; end; THouse = class(TInterfacedObject, IHouse) private procedure SayHello; //note: 私有方法! public end; implementation uses Dialogs; { THouse } procedure THouse.SayHello; begin ShowMessage('THouse say hello'); end; end.
语法上,并没有要求THouse的SayHello方法一定要是public的。上面的代码没有问题。好吧,这使得我倾向于认为:接口中所有的方法是可见的,而不说接口中所有的方法是public。它们毕竟有所不同。
这一点虽然很吊诡,但也提示我们:可以使用接口来提升一个类方法的可见性。其好处我们只需要修改接口而不需要修改实现类。相比较于抽象类,这是接口的一个不同之处。
这一点还可以增加一层约束,使得类中的一些方法只能通过特定的接口来访问。
也许还有其它用途,我就想到这些
2,抽象类是否可以create?
可以的。看代码:
type TAbs = class public procedure Test; virtual; abstract; end; ... var abs: TABS; begin abs := TABS.Create; //ok,这里还正常 abs.Test; //这里,错误 FreeAndNil(abs); end;
编译器只好给出一个警告了。似乎Delphi编译器认为程序员应该知道一个类是不是抽象类,问题是许多时候,嗯,我们真的不知道。好吧,那么怎么办呢?避免使用abstract关键字,使用place-holder方法。那么,上面的代码修改如下:
type TAbs = class public procedure Test; virtual; end; ... procedure TABS.Test; begin //note:这里什么都没有,这就是place-holder方法 end; var abs: TABS; begin abs := TABS.Create; //ok,这里还正常 abs.Test; //这里,ok FreeAndNil(abs); end;

浙公网安备 33010602011771号