当前位置:  开发笔记 > 编程语言 > 正文

这两组代码有什么不同

如何解决《这两组代码有什么不同》经验,为你挑选了1个好方法。

这两段代码之间有什么区别

type
  IInterface1 = interface
    procedure Proc1;
  end;

  IInterface2 = interface
    procedure Proc2;
  end;

  TMyClass = class(TInterfacedObject, IInterface1, IInterface2)
  protected
    procedure Proc1;
    procedure Proc2;
  end;

以下内容:

type
  IInterface1 = interface
    procedure Proc1;
  end;

  IInterface2 = interface(Interface1)
    procedure Proc2;
  end;

  TMyClass = class(TInterfacedObject,  IInterface2)
  protected
    procedure Proc1;
    procedure Proc2;
  end;

如果它们是同一个,那么它们是否有任何优点或可读性问题.

我想第二个意味着你不能编写一个实现IInterface2的类而不实现IInterface1,而第一个你可以.



1> Barry Kelly..:

如果我们讨论的是Delphi for Win32(Delphi for .NET有不同的规则),那么两段代码的效果会有很大不同,并且几乎没有相同之处.

    实现了接口的类必须实现该接口的祖先的所有成员,但它并没有暗示实施祖先.因此,尝试将类型为TMnClass的实例分配给类型为IInterface1的位置将对第二种情况失败.

    与前一点相关,如果IInterface1和IInterface2都具有GUID,则在第二种情况下,对于TMyClass的实例,具有目标类型IInterface1的接口引用的动态转换(使用Supports或' as')将失败.

    接口IInterface2在第二种情况下有一个额外的方法,它在第一种情况下没有.

    第二种情况下类型IInterface2的值可分配给IInterface1类型的位置; 第一种情况并非如此.

在这个例子中看看你自己:

    type
      A_I1 = interface
      end;

      A_I2 = interface(A_I1)
      end;

      A_Class = class(TInterfacedObject, A_I2)
      end;

    procedure TestA;
    var
      a: A_Class;
      x: A_I1;
    begin
      a := A_Class.Create;
      x := a; // fails!
    end;

    type
      B_I1 = interface
      end;

      B_I2 = interface
      end;

      B_Class = class(TInterfacedObject, B_I1, B_I2)
      end;

    procedure TestB;
    var
      a: B_Class;
      x: B_I1;
    begin
      a := B_Class.Create;
      x := a; // succeeds!
    end;

    begin
      TestA;
      TestB;
    end.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有