这两段代码有什么区别
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的类,而第一个就可以。
答案 0 :(得分:6)
如果我们谈论的是Delphi for Del32(Delphi for .NET有不同的规则),那么两段代码的效果会有很大的不同,并且几乎没有相同之处。
Supports
或“as
”)将失败在第二种情况下。在此示例中查看自己:
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是“卡车”,那么第二个选项可能更有意义。