小弟最近了解了一下接口的技术,学习的还不够深入。现有一个问题问各位大侠。
背景:
    我想自定义一组控件,比如有一个继承自TButton的TZBtn,还有一个继承自TEdit的TZEdit,假设就只有这两个(实际情况较多),我想在我自己创建的控件上都加上一个属性,比如 SomeMsg : String read FSomeMsg write SetSomeMsg; 我原来的办法就是每一个控件都加上SomeMsg的定义以及 SetSomeMsg的实现。因为TZBtn和TZEdit不是从一个父类继承来的。所以也就没法通过父类继承的办法来实现SomeMsg。而只能每一个我的自定义控件都重写一遍SomeMsg属性的定义和方法。
现在:
    通过了解接口的技术,我想可以通过 TZBtn和TZEdit都额外再继承一个接口的方法。即在接口中定义和实现SomeMsg的方法。这样的话,那么我的一组控件中所有需要增加的公共的特性都可以通过接口来实现,而具体的控件只需要继承了自己本来的父类后再继承一个接口即可,就可以实现了。
问题:
    小弟目前对接口技术知识了解了一点点,哪位大侠能不能给个简短的例子,或者告诉我哪些商业控件是如何实现的,我去参考他的代码也行。
    我现在只了解了接口的定义,以及接口的方法实现需要一个类来完成等的知识。还不够深入,还望不吝赐教!

解决方案 »

  1.   

    接口只是一个方法定义的地方,是没有具体实现的,你那种情况估计需要抽象类做他们两个的基类
    好久没用delphi,忘记了是否可以多基类继承,建议你看看《面向对象编程》的书
      

  2.   

    楼上的有没用过delphi,用过的不至于忘记delphi是不能多基类的吧
    楼上的有没用于c++,用过的都知道多基类的同名成员是多个复本的吧,单个复本只能用虚基类派生,但引起构造过程断裂,必需在所有派生类指明构造基类楼主的问题,可能是想代码重用吧,考虑用实例引用, 对某个简单属性来说没什么意义,对某共用功能就意义重大考虑用下面办法
    TFoo = class(...);
      procedure dosomething;
    end;TNewEdit = class(TEdit);
    private
      foo: TFoo;
    public
      constructor Create;
      begin
        foo := TFoo.Creeate;
      end;
    end;TNewButton = class(TButton)
    private
      foo: TFoo;
    public
      Create 方法同上
    end;
    这样,每个类就都有foo的一个实例复本考虑接口情况
    IFoo = interface
      procedure DoSomething; stdcall;
    end;TFoo = class(TInterfacedObject, IFoo);
      { IFoo }
      procedure DoSomething; stdcall;
    end;1. 共用接口声明的,每个类实例都有一个自已的接口实例(有点饶口,总得说 a.Foo, B.Foo 分别独立)
    TNewEdit = class(TEdit);
    private
      Ffoo: IFoo;
    public
      property Foo: IFoo read FFoo implements IFoo  constructor create; 
      begin
        Foo = TFoo; // 设的是属性, 使用到时会自动建立对像
      end;
    end;TNewButton = class(TButton)
    private
      Ffoo: IFoo;
    public
      property Foo: IFoo read FFoo implements IFoo  constructor create; 
      begin
        Foo = TFoo; // 设的是属性, 使用到时会自动建立对像
      end;
    end;
    2. 当Foo对像是由外部建立的,但在几个类实例中共用的(a.Foo, B.Foo 是共用同一个实例)考虑如下方法TNewEdit = class(TEdit);
    private
      Ffoo: IFoo;
      // 无 Create 需要public
      property Foo: IFoo read FFoo write FFoo;
    end;TNewButton = class(TButton)
    private
      Ffoo: IFoo;
    public
      property Foo: IFoo read FFoo write FFoo;
    end;使用的地方var
      Foo: IFoo;
    begin
      Foo := TFoo.Create as IFoo;
      
      Btn.Foo := Foo;
      Edit.Foo := Foo;  // 不要释放,Foo对像被引用记数了,最终会自动释放
    end;
      

  3.   

    关于Delphi中 灵活运用接口(interface), 隐藏核心代码, 设计低耦合程序.我的看看这一Bloghttp://hi.baidu.com/cncharles/blog/item/4a061df75e4fc123720eec20.html