`

Delphi中的接口和抽象类

 
阅读更多

 

接口:Interface

Delphi中接口的关键字是Interface,但它和Pascal单元中的Interface没有任何联系。

1、抽象类

Delphi中的抽象类只定义行为的类,它规定了由此派生的类必须具备某些行为。但是抽象类不实现这些行为,而必须由其派生类去实现这些行为。所以,它只是一种“抽象”的类,而且,我们无法为抽象类创建实例。比如这段代码:

TCode = class

Protected

function Decode(Src: String): String; virtual; abstract;

function Encode(Src: String): String; virtual; abstract;

End;

这是段代码定义了一个有密码的抽象类,它规定了该类的两个行为,即编码和解码。但它只是规定了这两个行为而没有去实现它们,因为具体到不同的加密体系,它们编码和解码的行为是不一样的,所以这两个行为交由具体的派生类去实现。这是一段合法的代码,但是当我们试图去创建它的实例的时候Delphi就会抛出一个EAbstractError的异常,因为我们不能为一个抽象类去创建它的实例。

抽象类只定义了行为而没有去实现它们,所以它是“抽象”的。

 

2、接口和抽象类的不同

接口也定义了一系列的行为而没有去实现这些行为,这一点上它和抽象类是一样的。准确地说,接口只是规定了接口的提供者和接口的使用者之间的协议。

既然有了抽象类了为什么还要接口?那一定是接口和抽象类有不同的地方,正是这种不同使它们应用在不同的场合或者满足不同的需要。弄清楚这些不同之处的过程,也就是我们理解接口这个概念的过程。

我们以同样的内容来声明一个接口:

ICode = interface

function Decode(Src: String): String;

function Encode(Src: String): String;

End;

 

从形式上看它和抽象类还是有点区别的:

1) 接口都以“I”打头(类以“T”打头)

2) 接口的关键字是interface(类的关键字是class)

3) 因为接口中所有的函数和过程都是虚的,所以无须再加上virtual的关键字

但以上的区别只是形式上的,还有一些实质上的区别:

1) 对接口创建实例的代码在Delphi中是非法的,在编译期就会出现异常

2) 接口中所有的方法都是公有的,因此不能对接口的域进行定义

3) 在接口中不能申明变量,这是它和类的一个很大的区别,因为接口只定义了行为而对实现这些行为不做规定,但是如果允许接口定义变量,则就会在某种程度上干预或限制实现行为的方法

4)接口是不变的,也就是说,一旦声明并公开了某个接口后就不允许再对它进行修改,如果我们要增删它所规定的行为,就只能另外声明一个接口

 

3、接口的GUID

GUID是“全球唯一标识符”的缩写,它借助复杂的算法而保证在全球范围内的唯一性。每个接口都有一个GUID,系统据此注册和调用接口。事实上,上面那段声明接口的代码是不完整的,完整的声明代码看上去应该是这样的:

 

ICode = interface

['{56E57F5F-5DD8-42FC-8D27-C35968C4474E}']

function Decode(Src: String): String;

function Encode(Src: String): String;

End;

好在我们不必去关心GUID是怎样产生的,当我们需要给一个接口创建一个GUID时,我们只要在Delphi的IDE中同时按下Ctrl、Shift和G三个键,光标所在的位置就会出现一个GUID。其实这不是Delphi自己胡编出来的GHID,而是Delphi调用了Windows的API的函数CoCreateGuid创建的,它借助开放软件基金会(OSF)定义的算法,从统计学的角度说,能保证其全球唯一性。

 

分享到:
评论

相关推荐

    抽象类和抽象方法.pdf

    抽象类中可以定义抽象方法,这些方法在子类中进行具体实现。 2. **声明格式**: - 抽象类声明:`abstract class ClassName` - 抽象方法声明:`abstract method methodName(paramList) returns returnType` 3. **...

    Delphi接口剖析源码..rar

    通过阅读和分析这些源码,你可以更深入地理解Delphi接口的工作原理和实际应用。 此外,接口在组件开发中也扮演着重要角色。Delphi的VCL(Visual Component Library)和FireMonkey(FMX)框架中,很多组件都通过接口...

    Delphi 泛型 接口约束的实例

    在 Delphi 中,接口(Interface)是一种纯抽象类型,定义了一组方法签名,但不提供具体的实现。任何类可以实现一个或多个接口,表明它支持接口中声明的所有方法。通过接口,我们可以确保对象遵循一定的规范,而无需...

    Delphi接口委托的例子代码

    本示例代码“Delphi接口委托的例子代码”着重展示了如何使用接口进行委托,并演示了在运行期间动态切换接口实现的技巧。 首先,让我们来看看`UMyIntf.pas`文件中的接口定义。在这个文件中,通常会声明一个或多个...

    Delphi接口编程

    通过本文的介绍,我们可以看出接口在 Delphi 中的应用非常广泛,尤其是在处理复杂的类间关系时。接口不仅可以简化类的设计,还能提高系统的灵活性和可扩展性。对于 Delphi 开发者来说,熟练掌握接口的使用是非常重要...

    delphi接口委托demo

    在这个类中,我们可以选择直接实现方法,或者将方法的调用委托给其他对象。 ```delphi TMyClass = class(TInterfacedObject, TMyInterface) private FDelegate: TMyInterface; public constructor Create(delegate...

    delphi接口统一方法

    4. **多态性**: Delphi的面向对象特性支持多态性,即接口的方法在不同的类中可以有不同的实现。这使得即使接口统一了方法签名,实际的行为可以根据具体对象的不同而变化。 ```delphi type TBaseClass = class...

    delphi接口开发

    5. **接口继承**:Delphi接口支持多重继承,一个接口可以继承多个其他接口,从而扩展其功能。这在设计大型系统时非常有用。 6. **IDispatch接口**:对于需要支持Automation(自动化)或Scripting(脚本)的组件,...

    delphi接口实例

    总的来说,"Delphi接口实例"是一个极好的学习资源,可以帮助开发者掌握在Windows环境下使用Delphi进行COM组件开发的技巧,从而提升软件的可扩展性和互操作性。通过实际操作和代码分析,你可以更好地理解和运用这些...

    Delphi中的DLL封装和调用对象技术 源码

    在Delphi编程环境中,DLL(动态链接库)是一种非常重要的技术,它允许开发人员将代码模块化,提高代码重用性,并减少应用程序的内存占用。...在实践中,结合接口、抽象类和导出函数,可以构建出高效且易于管理的系统。

    Delphi接口和面向对象的编程实例..rar

    接口在Delphi中是一个纯抽象的类型,它定义了一组方法,但不提供实现。接口通过`I`开头的标识符来声明,例如`IMyInterface`。一个类可以实现多个接口,从而承诺提供接口中定义的所有方法的实现。接口的主要优点是...

    Delphi官方中文手册

    此外,还会深入讲解面向对象编程的核心概念,如类、对象、继承、多态和封装,以及接口和抽象类的使用。 “控件及网络设计”章节则聚焦于Delphi的GUI(图形用户界面)开发。Delphi的VCL库提供了丰富的控件集,如按钮...

    Delphi抽象提高可扩展性例子及文章

    在Delphi中,我们可以创建抽象类,这些类不提供具体的实现,但定义了必须由子类实现的接口。这样,我们可以在不影响其他代码的情况下,增加新的功能或改变现有功能的实现。 2. **接口**:接口在Delphi中是一种纯...

    接口中的内部类.pdf

    在接口中定义一个普通成员内部类(非抽象类),意味着这个内部类将作为接口的一部分,任何实现该接口的类都可以访问并使用它。下面是一个简单的示例: ```delphi type IMyInterface = interface // 接口方法声明 ...

    Delphi--抽象方法、重载、覆盖。继承实例

    Delphi允许我们在一个类中定义多个同名方法,只要它们的参数数量或类型不同即可。这使得我们可以根据传入的参数类型或数量调用相应的方法,提高了代码的可读性和灵活性。例如: ```delphi class procedure MyMethod...

    DELPHI 中的 implements 指示符

    例如,在某些情况下,如果一个类需要实现的接口中有大量的方法,而这些方法的实际实现可能存在于其他类中,那么直接在当前类中实现这些方法可能会导致不必要的内存消耗。通过使用 `implements` 指示符,我们可以延迟...

    Delphi详细教程.7z

    抽象类用于定义接口和共享行为,但不能被实例化。静态接口则提供了无状态的方法集合,常用于提供服务或工具类。本章将详细解析这两者的差异和应用场合。 5. **第9章 创建定制组件** Delphi的强大之处在于其组件化...

    inherit Delphi继承的演示..rar

    Delphi还支持抽象类(类中包含抽象方法的类)和接口(纯虚方法的集合)。抽象类通常作为基类使用,定义公共接口但不提供具体实现。接口则更像一种契约,强制实现特定方法。 **继承深度和多重继承:** Delphi支持...

Global site tag (gtag.js) - Google Analytics