zoukankan      html  css  js  c++  java
  • 接口技术

    接口把类给包装了。类是应用程序功能的实现,所以必然会导致大而全,而接口是简单的,看看各个接口及其方法,都是很少的。
    类喜欢采用深层继承关系,这样一来改变一个父类属性将导致一堆子类属性的更新,但是接口可以申明而不实现,接口是不推荐深层继承的。
    我觉得MS对COM的说明是正确的,我们用了接口后可以在对用户隐藏内部实现的情况下面同时保护老功能还能使用,这也是光用类难以达到的。因为类就意
    味着要实现新功能,更改老功能,中间没有用户界面层,这样不利于用户调用与程序内部实现的隐蔽性(不对用户公开内部实现)。

    COM, VCL与ActiveX都是现代OOP编程的产物。它们的目的总的来说都是为了代码复用与程序开发与维护的方便。
    VCL是Inprise用来包装WinAPI的。我们用可视化的方法把一个又一个的VCL控件放在窗口上面就可以以类的调用格式来调用它的方法,设置它的属性,并利用它的消息响应
    来进行面向用户响应的开发了。但是VCL只能在Delphi与BCB中间使用,虽然我个人很喜欢它。
    COM与其说是一个具体的对象,不如说是一个技术方案。它提供的是一个简单易用的用户界面层的概念,那就是接口(Interface)的概念。一个用户能够从
    一个COM对象得到的只有接口。接口内部的类的实现是对用户隐蔽的。把实现与对外接口分开是一个对程序员和用户来说都不错的方案。对程序员来说他可以
    完全不管用户会看到什么和希望看到什么(用户要求),因为这部分与他无关只与接口有关,他可以以任何自己方式来实现任何一个功能。用户看到的则永远是一个又
    一个简单的接口(看看windows中的接口,每个都不是特别复杂,方便使用)。
    要注意的是接口是不能继承的,虽然在很多编程语言中(如VC和Delphi等),一个接口被说成是从另一个继承的。而且在程序中间也是与其它类的继承简单的写成一样的形式如:
    IMyInterface2 = class(IMyInterface1, Txxxx)
    ...
    但是接口的继承只是表面上的,一切的功能实现还要类来!
    继承在原来的意义上是要继承代码的实现以进行代码复用的,接口是没有实现的,因此接口的“继承”是假继承。
    ActiveX控件是COM技术的一个具体实现。
    作为一个ActiveX控件它要支持与实现一系列接口如IDispatch等等,一个正确的实现了MS对ActiveX控件要求的那些接口的COM
    对象就是一个ActiveX控件。ActiveX控件是二进制兼容的,windows系统都支持,一般的编程语言都能在其中使用它。比VCL当然要用的广啦。

    COM接口当然没有构造函数啦,只有COM接口的实现类有构造函数.
    但是在Delphi里面你要用CreateComObject来创建接口的实现类.
    要创建一个COM对象的实例最好在dpr文件中间调用,只有这样COM对象才能正确的初始化.

    假设有一接口 : ITest = interface
                          [XXXX-XXXX-XX-XX]
                          procedure Test1 ;
                          procedure Test2 ;
                       end ;
    另有一个类实现现了ITest接口
                  TTest =class (TInterfacedObject , ITest )
                      procedure Test1 ;
                      procedure Test2 ;
                  end;  
    在客户端:
       var
           o :TTest ;
           inf :ITest ;
      begin
           o := TTest.create ;
           inf := o as ITest ;//或 o.getinterface (ITest,inf);
           inf.Test1 ;
           inf.Test2 ;  
      end  ;
    我想问的是Interface inf是如何触发TTest.Test1 和Test2的 ?是靠名字吗,我猜应该不是,是靠位置吗  ?

    delphi7编译器通过VMT,在机器码中产生从对象取得接口,然后再指定给接口变量的代码

    这种使用方法容易出错,
    在客户端:
       var
           o :TTest ;
           inf :ITest ;
      begin
           o := TTest.create ;
           inf := o as ITest ;//或 o.getinterface (ITest,inf);
           inf.Test1 ;
           inf.Test2 ;  
      end  ;
    而且不合接口与实现分离原则
    你需要另外设计一个工厂,返回这个ITest接口对象供客户使用

  • 相关阅读:
    重新想象 Windows 8 Store Apps (15) 控件 UI: 字体继承, Style, ControlTemplate, SystemResource, VisualState, VisualStateManager
    重新想象 Windows 8 Store Apps (12) 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示
    返璞归真 asp.net mvc (10) asp.net mvc 4.0 新特性之 Web API
    与众不同 windows phone (29) Communication(通信)之与 OData 服务通信
    与众不同 windows phone (33) Communication(通信)之源特定组播 SSM(Source Specific Multicast)
    与众不同 windows phone (27) Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏
    与众不同 windows phone (30) Communication(通信)之基于 Socket TCP 开发一个多人聊天室
    返璞归真 asp.net mvc (12) asp.net mvc 4.0 新特性之移动特性
    重新想象 Windows 8 Store Apps (2) 控件之按钮控件: Button, HyperlinkButton, RepeatButton, ToggleButton, RadioButton, CheckBox, ToggleSwitch
    重新想象 Windows 8 Store Apps (10) 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom
  • 原文地址:https://www.cnblogs.com/railgunman/p/1881302.html
Copyright © 2011-2022 走看看