这两组代码有什么不同

时间:2008-10-02 14:38:18

标签: delphi oop interface

这两段代码有什么区别

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;

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

我想第二种意味着你不能在没有实现IInterface1的情况下编写一个实现IInterface2的类,而第一个就可以。

4 个答案:

答案 0 :(得分:6)

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

  1. 实现其接口的类必须实现该接口的祖先的所有成员,但它隐式实现祖先。因此,尝试将类型为TMnterClass的实例分配给类型为IInterface1的位置将会因第二种情况而失败。
  2. 与上一点相关,如果IInterface1和IInterface2都具有GUID,则在TMyClass实例上,目标类型为IInterface1的接口引用的动态强制转换(使用Supports或“as”)将失败在第二种情况下。
  3. 接口IInterface2在第二种情况下有一个额外的方法,它不在第一种情况下。
  4. 第二种情况下类型IInterface2的值可分配给IInterface1类型的位置;第一种情况并非如此。
  5. 在此示例中查看自己:

        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.
    

答案 1 :(得分:4)

首先,我假设第二个例子的IInterface2声明是一个错字,应该是

IInterface2 = interface(Interface1)

因为继承自身是荒谬的(即使编译器接受它)。

“继承”是回答你问题的关键词。在示例1中,两个接口是完全独立的,您可以实现一个,另一个或两者都没有问题。在示例2中,如果没有实现interface1,则无法实现interface2,但之所以如此,是因为它使interface1 成为 interface2的一部分。

然后,差异主要在于结构性和组织性,而不仅仅是可读性。

答案 2 :(得分:1)

假设你的意思

...
IInterface2 = interface(Interface1)
...

我和你一样解释它,第二种形式需要一个实现Interface2的类来实现Interface1 ,而第一种形式不需要。

答案 3 :(得分:1)

  

我想第二种意味着你不能在没有实现IInterface1的情况下编写一个实现IInterface2的类,而第一个就可以。

这将是技术上的差异。

哪一个更好取决于接口实际上是什么。如果一个IInterface2存在而没有它也是一个IInterface1吗?

如果IInterface1是“可显示的”且IInterface2是“可存储的”,则第一个选项可能更有意义。如果IInterface1是“车辆”而IInterface2是“卡车”,那么第二个选项可能更有意义。