`
ruilin215
  • 浏览: 1161614 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

接口是AS出来的

阅读更多

很多人在接口定义中,喜欢使用派生的方式进行定义。但是我要说的是,接口不应该派生,而应该AS出来。

接口是一种契约,它和类不同。当接口从COM中诞生的时候,其具备的三个方法经常被人忽略:
IInterface=interface
[
'{00000000-0000-0000-C000-000000000046}']
functionQueryInterface(
constIID:TGUID;outObj):HResult;stdcall;
function_AddRef:Integer;stdcall;
function_Release:Integer;stdcall;
end;
看一个体系的设计,其实就是看它基本架构中提供了什么服务。TObject如此,IInterface也是如此。
观察这个架构,其中,包含两类服务:
第一、 引用计数服务。这也是非常著名的接口生存器自管理的实现过程。包括_AddRef和_Release两个方法。
第二、 接口查询服务。从一个接口查询另一个接口的方式。
第一个大家都很熟悉,也不是我们今天关心的。主要来说说第二个服务:接口查询服务。
如果稍不注意,你可以会产生一个疑问:就有一个接口,它要这个QueryInterface有什么用?我非常理解这种想法。其实这个想法的根源很可能来自TObject给我们的映像!
在接口的世界里,我们处理的可不是一个单一的接口!一个典型的应用就是同一个实体,同时实现多个接口!这和对象完全不一样。
还有一点:接口不关心实现!对于我们对象来说,除了申明公布的方法,还得复杂去实现。接口就不一样,只要附属在某个对象上就可以了。对于使用者来说,完全不需要考虑那个对象来实现的,更不需要那个语言来实现的!
基于查询接口,我们还应该发现一个道理。在业务接口设计中并不主张你派生!虽然很多语言中提供了派生机制。
对于一个业务实体。它体现出来的特性,在对象体系中,派生类是基于基类附加的信息。而在接口体系中,额外的信息,会以更准确的接口来体现。如下图:
ObjectSys.gif

相对于对象体系,接口体系认为,所有额外公布出来的方法是有意义的集合!这个集合必然有它自己存在的意义。事实上,接口体系认为,这个集合一定是一个新的接口。如下图:
IntfSys.gif
类可以是一个多个接口的混合体。因为实体往往在不同的地方表现出不同的方面。但是接口必须是单一职责的。将一些没有被设计者认真思考归类的方法,简单附加到一个接口上而形成新的接口的做法,在接口体系中是不被推荐的。
如果派生接口,我们可能会出现这样的用法:

IB
=interface(IA)
end;

a:IA;
b:IB;

b:
=TB.Create;
a:
=IA(b);
b:
=IB(a);
这段代码,本身可能没有问题,可是你要是细想一下,所谓强制转换,就是说你已经知道IA和IB是同一个对象实现的了!并且他们的指针是同一个地址。这就是说你在使用这类接口的同时,已经知道它的实现了。
如果:

TA
=class(TInterfacedObject,IA)
end;

TB
=class(TInterfacedObject,IB)
end;
那么你还会发现,IA(b)得到的接口和b as IA得到的接口不是同一个接口啊。下面这段代码可以验证:

type

IA
=interface
[
'{CDDE945F-BD5C-49B4-AF21-945460782C62}']
procedureA;
end;

IB
=interface(IA)
[
'{BE689474-2621-4BB0-BB1B-F77E6D557560}']
procedureB;
end;

TA
=class(TInterfacedObject,IA)
procedureA;
end;

TB
=class(TA,IB)
procedureB;
end;


...{TB}

procedureTB.B;
begin

end;

...{TA}

procedureTA.A;
begin

end;

procedureTForm1.Button1Click(Sender:TObject);
var
a:IA;
b:IB;
begin
b:
=TB.Create;

ShowMessage(IntToStr(Integer(b)));
a:
=IA(b);
ShowMessage(IntToStr(Integer(a)));
a:
=basIA;
ShowMessage(IntToStr(Integer(a)));
end;
也就是说,所谓的接口类型转换的代码实际上是依赖于实现的!这一点在接口体系中也是强烈不推荐的。
回到最初的话题。架构体系决定或者体现其设计原则。我们在接口体系的设计中,应该避免使用派生关系。多关注那些集合的本质所在。
记住,接口是AS出来的。
分享到:
评论

相关推荐

    FPGA中AS和JTAG接口的使用

    在FPGA(现场可编程门阵列)设计中,AS(Advanced Serial)和JTAG(Joint Test Action Group)接口是两种常见的配置和测试接口。它们各自具有独特的作用和优势,并在开发过程中扮演着重要的角色。 **JTAG接口**,全称为...

    AS3 简单接口实现

    在ActionScript 3 (AS3)中,接口(Interface)是一种定义特定方法集合的蓝图,它强制类去实现这些方法。接口是面向对象编程中的一个重要概念,它允许我们定义一个对象必须实现的方法,但不涉及具体的实现细节。AS3中...

    UDP.rar_as3 udp_flash as3.0 UDP_flash发送udp_udp as3_windows as3.0

    这个"UDP.rar_as3 udp_flash as3.0 UDP_flash发送udp_udp as3_windows as3.0"的压缩包,看起来包含了一个名为"UDP.fla"的文件,这是一个Flash的源文件,可能是一个AS3的项目,用于演示或教学如何在Flash中使用UDP...

    AS5035 AS5030 AS5145 AS5163 AS5134数据手车资料

    这些文件标题和描述提及的AS5035、AS5030、AS5145、AS5163和AS5134是来自意法半导体(STMicroelectronics)的一系列磁感应传感器,主要应用于工业自动化、机器人技术、智能家居和物联网(IoT)设备等领域。这些器件在...

    易福门AS-I 接口代替复杂的布线.zip

    易福门AS-I接口是一种工业自动化领域的通信标准,它的全称是Actuator Sensor Interface,即执行器传感器接口。这个技术的出现,旨在简化工业设备之间的连接,尤其是那些分布式的小型传感器和执行器的布线问题。在...

    AS 接口整套设备[手册].pdf

    根据提供的信息,我们可以了解到这份文档是关于AS接口整套设备的操作手册。该手册包含了不同语言版本的原始操作说明,这表明这是一个国际通用的手册。接下来,我们将深入解析这份手册所涉及的重要知识点。 ### AS...

    flash as3接口的实现

    在ActionScript 3.0(AS3)中,接口(Interface)是一种定义对象必须实现特定方法的规范。接口是类型系统的重要组成部分,它允许我们强制类遵循特定的合同,确保不同类之间的一致性和可互操作性。接下来,我们将深入...

    AS5047P_AS5047p使用方法_as5047p模式_AS5047stm32_磁编码器_as5047p中文

    AS5047P通过SPI(Serial Peripheral Interface)接口与STM32通信。SPI是一种同步串行通信协议,需要四条信号线:MISO(主输入,从机输出)、MOSI(主输出,从机输入)、SCK(时钟)和SS(片选)。在硬件设计时,确保...

    as3corelib-.92.11.rar_as 3 corelib_as3_as3corelib_as3corelib API

    AS3CoreLib是ActionScript 3(AS3)的一个重要扩展库,被广泛用于增强标准AS3类库的功能。这个库是由Adobe官方推荐的,它提供了许多实用的工具和类,帮助开发者更高效地处理各种任务,如图像处理、数组操作、网络...

    AS5047P_stm32f103test.rar_as5047p程序_stm32 AS5047P_stm32 AS513

    在本文中,我们将深入探讨如何使用STM32F103微控制器通过SPI(Serial Peripheral Interface)接口与AS5047P进行通信,从而获取电机的角度信息。 首先,我们要了解STM32F103系列微控制器。这是一款基于ARM Cortex-M3...

    单片机控制RTL8019AS实现以太网接口实例

    在本文中,我们将深入探讨如何使用单片机控制RTL8019AS芯片来实现以太网接口。RTL8019AS是一款经典的以太网控制器,由Realtek半导体公司设计,广泛应用于早期的嵌入式系统和网络设备中。通过单片机与RTL8019AS的交互...

    AS3933低频发射代码,通过MCU控制,发射125KHZ频率.rar_125khz_AS3933驱动_CEM_as3933低频

    AS3933驱动软件是实现这一功能的关键,它详细阐述了SPI(串行外设接口)驱动的过程,帮助开发者理解和实现与AS3933的通信。 首先,AS3933芯片是一款专为低频电磁发射设计的集成电路,常见于门禁系统、动物追踪器、...

    基于RTL8019AS的串口与以太网接口转换器

    《基于RTL8019AS的串口与以太网接口转换器》 随着现代信息技术的飞速发展,单片机系统与互联网的融合成为必然趋势。然而,传统的单片机系统通常仅配备RS-232串行通信接口,无法直接接入以太网。为了弥补这一缺陷,...

    AS60x指纹识别SOC用户手册V10_SOC_AS608_AS608指令手册_as60x_

    3. 接口支持:AS608提供了多种接口选项,如I²C、SPI和UART,方便与各种主控器进行通信。 4. 指令集:AS608的指令手册详细介绍了用于控制和配置芯片的各种命令,包括初始化、图像捕获、模板生成和比对等操作。 三、...

    AS8510.zip

    AS8510.c和AS8510.h的组合就是一个典型的模块,封装了与AS8510芯片相关的所有操作,对外提供简洁的接口。 在使用这些源代码时,需要注意以下几点: 1. 确保STM32F4的硬件配置正确,如时钟设置、GPIO配置、中断设置...

    STM32F103_AS5048A-master.rar_AS5048 STM32_STM32F103_as5048a_as5

    这些函数可能包括了SPI接口的配置、AS5048A的命令发送、解析返回的数据以及处理传感器的中断事件。开发者可能已经实现了将AS5048A的绝对角度值转化为可读性强的格式,并提供了相应的API供其他应用程序调用。 在开发...

    as3 接口类的用法和好处

    ### AS3 接口类的用法和好处详解 #### 一、引言 本文将深入探讨Adobe Flash Platform中的ActionScript 3 (AS3) 如何利用接口(interface)来优化程序设计,特别是在需要多态性和扩展性的场景下。首先,我们将通过一个...

    AS5600角度编码器 STM32F103RCT6单片机硬件I2C接口读写驱动程序源码.rar

    AS5600角度编码器 STM32F103RCT6单片机硬件I2C接口读写驱动程序源码, int main(void) { float angle = 0; LED_init(); delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); ...

Global site tag (gtag.js) - Google Analytics