gpt4 book ai didi

delphi - 这两套代码有什么区别

转载 作者:行者123 更新时间:2023-12-03 15:19:00 25 4
gpt4 key购买 nike

这两段代码有什么区别

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 的类,而使用第一个则可以。

最佳答案

如果我们谈论的是 Delphi for Win32(Delphi for .NET 有不同的规则),这两个代码片段具有非常不同的效果,并且几乎不相同。

  1. 实现其接口(interface)的类必须实现该接口(interface)的祖先的所有成员,但它隐式实现祖先。因此,对于第二种情况,尝试将 TMyClass 类型的实例分配给 IInterface1 类型的位置将失败。
  2. 与上一点相关,如果 IInterface1 和 IInterface2 都具有 GUID,则目标类型为 IInterface1 的接口(interface)引用的动态转换(使用 Supports 或“as”)在第二种情况下,TMyClass 实例会失败。
  3. 接口(interface) IInterface2 在第二种情况下有一个额外的方法,而在第一种情况下则没有。
  4. 在第二种情况下,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.

关于delphi - 这两套代码有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/162651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com